計數器:CountDownLatch,CountDownLatch,CyclicBarrier

//	建立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();
  • 調用await()計數器減1,同時等待計數器變爲0。
  • 當計數器減到0時持有barrier.await()的線程會向下執行,同時調用barrier的回調函數。
  • 能夠循環利用,具有自動重置功能。

總結:

CountDownLatch主要用來解決一個線程等待多個線程的場景,能夠類比旅遊團團長要等待全部的遊客到齊才能去下一個景點;而CyclicBarrier是一組線程之間互相等待 ,更像 是幾個驢友之間不離不棄。除此以外CountDownLatch的計數器是不能循環利用的,也就是說一旦計數器減到0,再有線程調用await(),該線程會直接經過。但CyclicBarrier的計數器是能夠循環利用的,並且具有自動重置的功能,一旦計數器減到0會自動重置到你設置的初始值。除此以外,CyclicBarrier還能夠設置回調函數。線程


**** 碼字不易若是對你有幫助請給個關注****code

**** 愛技術愛生活 QQ羣: 894109590****get

相關文章
相關標籤/搜索