如何確保多線程已經全部執行完成


  利用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));
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM