并发实战:多线程处理任务,结束后,执行后续操作

时间:2021-04-06 21:41:28

场景:

分批从大列表 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:纯手敲代码,不保证无误运行。