一个任务队列的BlockingQueue实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一个任务队列的BlockingQueue实现

一、Concurrent简单介绍

Concurrent是jdk1.5推出来的对多线程实现的进一步封装,它大大的简化了多线程开发。

concurrent包分成了三个部分,分别是java.util.concurrent、java.util.concurrent.atomic 和java.util.concurrent.lock。内容涵盖了并发集合类、线程池机制、同步互斥机制、线程安全的变量更新工具类、锁等等常用工具。

Executor:具体Runnable任务的执行者。

ExecutorService:一个线程池管理者,其实现类有多种,比如普通线程池,定时调度线程池ScheduledExecutorService等,我们能把一个

Runnable,Callable提交到池中让其调度。

Future:是与Runnable,Callable进行交互的接口,比如一个线程执行结束后取返回的结果等等,还提供了cancel终止线程。

BlockingQueue:阻塞队列。

二、一个任务队列的BlockingQueue实现

public int FetchInvertal = 1000;

public Datum newdatum = null;

// Creates a LinkedBlockingQueue with a capacity of Integer.MAX_VALUE. // 理论上Integer.MAX_VALUE.的任务排队

final BlockingQueue queue = new LinkedBlockingQueue(); // 线程池

// 其中一个线程,取出待处理资料,put到queue

// 其余四个线程处理具体业务

final ExecutorService fetchdataservice = Executors

.newSingleThreadExecutor();

final ExecutorService convertservice = Executors.newFixedThreadPool(4); //计数

final AtomicInteger wc = new AtomicInteger();

final AtomicReference atomstarttime=new

AtomicReference(null);

// FetchList线程

Runnable fetchlist = new Runnable() {

public void run() {

while (true) {

try {

List tmpls = getLatestDatums("1", tomstarttime.get());

if (tmpls != null && tmpls.size() > 0) {

queue.addAll(tmpls);

atomstarttime.set(tmpls.get(tmpls.size() - 1).getAddtime());

tmpls=null;

}

// 每隔一秒钟就检测一下是否有新的待处理的数据

Thread.sleep(FetchInvertal);

} catch (InterruptedException ex) {

}

}

}

};

fetchdataservice.submit(fetchlist);

fetchdataservice.shutdown();

// 四个处理线程

for (int index = 0; index < 4; index++) {

Runnable exewrite = new Runnable() {

public void run() {

int port = 8100 + wc.getAndIncrement();

while (true) {

try {

//如果队列里没有数据,会自动退出当前进程,为了防止进程被停掉,先判断是否有任务队列//队列里去看有没有任务,一直循环。

if (queue.size() > 0) {

Datum datum = queue.take();

if (datum != null) {

if (dobiz==true) {//此条件是伪码

// 若成功,自动审核通过

updateDatumState(datum.getUuid(), "3");

} else {

// 若不成功,自动审核不通过

updateDatumState(datum.getUuid(), "2");

}

}

} else {

Thread.sleep(2000);//如果队列里没有任务了,睡眠两秒}

} catch (InterruptedException e) {

}

}

}

};

convertservice.submit(exewrite);

}

convertservice.shutdown();

}

private List getLatestDatums(String status, String starttime) { //返回最新产生的待处理的任务列表

}

private String updateDatumState(String uuid, String status) { //更新当前任务状态,打上已处理完成,或处理异常的标志

}

相关文档
最新文档