如何保證線程按照指定次序執行-CountDownLatch
在前幾篇文章
《如何保證線程按照指定次序執行-Thread.join》
《如何保證線程按照指定次序執行-newSingleThreadExecutor線程池》
《如何保證線程按照指定次序執行-Join函數的另一種用法》中,
我們闡述了如何使用Thread.join()函數,單容量的線程池來保證多個線程的執行順序,今天我們來嘗試用另一種方式,通過CountDownLatch來實現。
CountDownLatch的官方文檔如下所述:
允許一個或多個線程等待直到在其他線程中執行的一組操作完成的同步輔助。
其中,主要的兩個方法是await與countDown
await()
導致當前線程等到鎖存器計數到零
countDown()
減少鎖存器的計數,如果計數達到零,釋放所有等待的線程。
即按照CountDownLatch的思路來實現線程順序執行,需要闡述為:
在C線程之前前,要先執行B線程;在B線程執行前,先執行A線程。
C線程中調用await方法等待B線程執行完畢,B線程執行完畢后調用countDown從而喚起C線程繼續執行。
同樣的,B線程中調用await方法等待A線程執行完畢,A線程執行完畢后調用countDown從而喚起B線程繼續執行。
實現代碼如下所示:需要使用兩個CountDownLatch對象,分別來控制A線程先于B線程執行,以及B線程先于C線程執行。
package com.qiweiwei.thread; import java.util.concurrent.CountDownLatch; public class ThreadCountDownLatchDemo { public static void main(String[] args) throws InterruptedException { final CountDownLatch latchA = new CountDownLatch(1); final CountDownLatch latchB = new CountDownLatch(1); Thread A = new Thread(() -> { System.out.println("A線程執行"); latchA.countDown(); }); Thread B = new Thread(() -> { try { System.out.println("等待A線程執行..."); latchA.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("B線程執行"); latchB.countDown(); }); Thread C = new Thread(() -> { try { System.out.println("等待B線程執行..."); latchB.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("C線程執行"); }); C.start(); B.start(); A.start(); } }
執行結果如下所示:
等待B線程執行…
等待A線程執行…
A線程執行
B線程執行
C線程執行
注意,通過try-catch來確保子線程中的countDown得到執行,從而保證后續線程可以被成功喚醒。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。