// 建立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