// 建立2个线程的线程池 Executor executor = Executors.newFixedThreadPool(2); while(存在未对帐订单){ // 计数器初始化为2 CountDownLatch latch = new CountDownLatch(2); // 查询未对帐订单 executor.execute(()->{ pos = getPOrders(); latch.countDown(); }); // 查询派送单 executor.execute(()->{ dos = getDOrders(); latch.countDown(); }); // 等待两个查询操做结束 latch.await(); // 执⾏对帐操做 diff = check(pos, dos); // 差别写⼊差别库 save(diff); }
CountDownLatch: 一个线程等待多个线程。java
//定义一个初始值为2的计数器 CountDownLatch latch = new CountDownLatch(2); //计数器-1 latch.countDown(); //线程等待,等待至计数结束。 latch.await();
CyclicBarrier:多个线程相互等待,等待结束执行回调。函数
//建立一个初始值为2得计数器 CyclicBarrier barrier = new CyclicBarrier(2, ()->{ executor.execute(()->check()); //回调函数 }); //等待 barrier.await();
CountDownLatch主要用来解决一个线程等待多个线程的场景,能够类比旅游团团长要等待全部的游客到齐才能去下一个景点;而CyclicBarrier是一组线程之间互相等待 ,更像 是几个驴友之间不离不弃。除此以外CountDownLatch的计数器是不能循环利用的,也就是说一旦计数器减到0,再有线程调用await(),该线程会直接经过。但CyclicBarrier的计数器是能够循环利用的,并且具有自动重置的功能,一旦计数器减到0会自动重置到你设置的初始值。除此以外,CyclicBarrier还能够设置回调函数。线程
**** 码字不易若是对你有帮助请给个关注****code
**** 爱技术爱生活 QQ群: 894109590****get