一个任务队列的BlockingQueue实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
// 其中一个线程,取出待处理资料,put到queue
// 其余四个线程处理具体业务
final ExecutorService fetchdataservice = Executors
.newSingleThreadExecutor();
final ExecutorService convertservice = Executors.newFixedThreadPool(4); //计数
final AtomicInteger wc = new AtomicInteger();
final AtomicReference
AtomicReference
// FetchList线程
Runnable fetchlist = new Runnable() {
public void run() {
while (true) {
try {
List
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
}
private String updateDatumState(String uuid, String status) { //更新当前任务状态,打上已处理完成,或处理异常的标志
}