並發實戰:多線程處理任務,結束後,執行後續操作
場景:
分批從大列表 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:純手敲代碼,不保證無誤運行。
並發實戰:多線程處理任務,結束後,執行後續操作