并发实战:多线程处理任务,结束后,执行后续操作
场景:
分批从大列表 blist 读取数据,执行验证过滤,符合条件的加入到列表中。然后执行批量入库操作。
思路:
多任务从 blist 取数据执行,采用Excuetors框架;
多线程插表,列表需要线程安全,采用ConcurrentLinkedQueue;
blist 取数完毕,执行批量入库操作,采用CountDownLatch卡住。
确认当前批次验证成功记录已插入到列表中。
伪代码:
CountDownLatch cLatch = new CountDownLatch(1);
多线程验证 blist 加入queue:
ExecutorService exec = Excuetors.newCachePool(3);
ConcurrentLinkedQueue<Object> queue = new ConcurrentLinkedQueue<Object>();
Runnable task = new Runnable() {
public void run(
for(String str : blist){
validate(str) == true
queue.add(str);
}
) {
} };
if(!exec.isShutDown)(
exec.execte(task);
}
while(true){
if(exec.isTerminated){
break;
}
Thread.sleep(20);
}
exec.shutDown();
cLatch.countDown();
return queue;
批量插入:
cLatch.await();
batchInsert.insert(quue);
PS:纯手敲代码,不保证无误运行。