首頁>科技>

女神鎮樓

少年女神

最近公司新分來一批剛畢業的大學生,然後給每個新員工都分配了一個導師,(咳、咳、咳),本人不才,正是導師中的一員。昨天下午新同事就帶著一個問題來了,有這樣一個場景:公司招待客戶,給來訪客戶泡茶。有兩個接待人員大王和小王,大王負責燒水,水燒開需要5分鐘;小王負責清洗茶具和取茶葉。兩人的工作都完成後,才可以開始給客戶泡茶。

針對這個場景,他編寫了如下的程式碼:

@Slf4jpublic class LockDemo {    // 柵欄    private static CountDownLatch countDownLatch = new CountDownLatch(2);    // 屏障    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(3);    public static void main(String[] args) throws InterruptedException, BrokenBarrierException {        cyclicBarrier();    }    public static void countDownLatch() throws InterruptedException {        // 負責燒水        Thread bigKing = new Thread(() -> {          log.info("開始燒水");            try {                TimeUnit.SECONDS.sleep(10);//模擬燒水過程                log.info("水燒好了");                countDownLatch.countDown();            } catch (InterruptedException e) {                e.printStackTrace();            }        });        // 清洗茶具和取茶葉        Thread littleKing = new Thread(() -> {            log.info("開始清理茶具");            try {                TimeUnit.SECONDS.sleep(2); // 模擬清理茶具                log.info("開始取茶葉");                TimeUnit.SECONDS.sleep(2);// 模擬取茶葉                log.info("茶葉取好了");                countDownLatch.countDown();            } catch (InterruptedException e) {                e.printStackTrace();            }        });        littleKing.start();        bigKing.start();        countDownLatch.await();        log.info("取到茶葉,燒好水,開始泡茶=====");    }    public static void cyclicBarrier() throws BrokenBarrierException, InterruptedException {        // 負責燒水        Thread bigKing = new Thread(() -> {            log.info("開始燒水");            try {                TimeUnit.SECONDS.sleep(10);//模擬燒水過程                log.info("水燒好了");                cyclicBarrier.await();            } catch (InterruptedException e) {                e.printStackTrace();            } catch (BrokenBarrierException e) {                e.printStackTrace();            }        });        // 清洗茶具和取茶葉        Thread littleKing = new Thread(() -> {            log.info("開始清理茶具");            try {                TimeUnit.SECONDS.sleep(2);//模擬清理茶具                log.info("開始取茶葉");                TimeUnit.SECONDS.sleep(2); // 模擬取茶葉                log.info("茶葉取好了");                cyclicBarrier.await();            } catch (InterruptedException e) {                e.printStackTrace();            } catch (BrokenBarrierException e) {                e.printStackTrace();            }        });        bigKing.start();        littleKing.start();        cyclicBarrier.await();        log.info("取到茶葉,燒好水,開始泡茶=====");    }}

先講解一下他的程式碼結構:定義了兩個方法,分別使用CountDownLatchCyclicBarrier來控制執行緒的協作問題。他的問題是:這兩個類有什麼區別?

CountDownLatch(柵欄)

我們先看看大神Doug Lea對該類的說明

 * A synchronization aid that allows one or more threads to wait until * a set of operations being performed in other threads completes.

同步器,允許一個或多個執行緒等待直到其他執行緒完成一組操作。

public void await() throws InterruptedException——阻塞執行緒public boolean await(long timeout, TimeUnit unit) throws InterruptedException——阻塞執行緒,超過等待時間將被喚醒public void countDown()——減少門閂的個數CyclicBarrier(屏障)

我們先看看大神Doug Lea對該類的說明

/** * A synchronization aid that allows a set of threads to all wait for * each other to reach a common barrier point.  CyclicBarriers are * useful in programs involving a fixed sized party of threads that * must occasionally wait for each other. The barrier is called * <em>cyclic</em> because it can be re-used after the waiting threads * are released. **/

同步器,允許一組執行緒都等待彼此達到一個共同的障礙點。可重置屏障條件,迴圈使用。

difference[酷]CountDownLatch是某個執行緒執行到某個節點上時,給同步計數器減一,該執行緒會繼續執行,不會阻塞;CyclicBarrier的某個執行緒執行到屏障點上,該執行緒會被立即阻塞,直到所有的執行緒都到達了這個屏障點,然後依次喚醒所有阻塞的執行緒CountDownLatch不可重用,計數器值為0該CountDownLatch就不可再用;CyclicBarrier可重用的,因為內部計數器可重置。簡單的例子

上面說的可能比較抽象,舉兩個簡單的例子來說說可能的應用場景

CountDownLatch的應用場景——交作業,只有當班裡面所有的人都將作業交了,課代表才會將作業報給老師,交了作業的同學,就可以放學,去做其他的事情了,不用等著沒有交作業的同學。CyclicBarrier的應用場景——短跑比賽,有15人參加比賽,當一個選手到達終點,此時他只能休息,需要等待其他的參賽選手跑完比賽,才會進行後面的頒獎典禮。

PS:通俗點來講,選擇使用哪個同步器,只需要根據完成任務的執行緒是否需要等待未完成任務的執行緒。CountDownLatch不需要等待,CyclicBarrier需要等待

風裡來,雨裡去,我是最美打工人

8
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 日本四足步行機器人開始巡迴平城宮,會超越人類發現不易察覺缺陷