利用CountDownLatch閉鎖實現。
CountDownLatch可以使一個或多個線程等待一組事件的發生,閉鎖狀態包含一個計數器,該計數器被初始化為一個正數,表示需要等待事件的數量。
發揮主要作用的兩個方法分別是:
countDown(); 遞減計數器,表示一個事件已經發生了;
await(); 等待計數器達到零,如果計數器的值非零,那么await會一直阻塞直到計數器為零,或等待中的線程中斷,或等待超時。
public class TimeTest{ public void cyclic() { for(int i=0;i < 100;i++) { System.out.println(Thread.currentThread().getId() + "---" + i); } } public static void main(String[] args) throws InterruptedException { int nThread = 100; final CountDownLatch endGate = new CountDownLatch(nThread); TimeTest timeTest = new TimeTest(); for(int i=0;i<nThread;i++){ Thread t = new Thread(() -> { try { timeTest.cyclic(); }finally { endGate.countDown(); } }); t.start(); } endGate.await(); System.out.println("線程執行完成"); } }
另外,我們還可以利用CountDownLatch來計算多線程執行一個任務需要的時間。
public class TimeTest{ //待測試方法 public void cyclic() { for(int i=0;i < 100;i++) { System.out.println(Thread.currentThread().getId() + "---" + i); } } public static void main(String[] args) throws InterruptedException { int nThread = 100; final CountDownLatch startGate = new CountDownLatch(1); final CountDownLatch endGate = new CountDownLatch(nThread); TimeTest timeTest = new TimeTest(); for(int i = 0;i < nThread;i++){ Thread t = new Thread(() -> { try { startGate.await(); try { timeTest.cyclic(); }finally{ endGate.countDown(); } } catch (InterruptedException ignored) { } }); t.start(); } long start = System.nanoTime(); startGate.countDown(); endGate.await(); long end = System.nanoTime(); System.out.println("耗時:" + (end-start)); }