Java多線程--等待所有子線程執行完的五種方法


方法一:用sleep方法

讓主線程睡眠一段時間,當然這個睡眠時間是主觀的時間,是我們自己定的,這個方法不推薦,但是在這里還是寫一下,畢竟是解決方法

 

方法二:Thread的join()方法

等待所有的子線程執行完畢,主線程在執行,thread.join()把指定的線程加入到當前線程,可以將兩個交替執行的線程合並為順序執行的線程。比如在線程B中調用了線程A的Join()方法,直到線程A執行完畢后,才會繼續執行線程B。

 

 

 方法三:等待多線程完成的CountDownLatch

注意:countDownLatch不可能重新初始化或者修改CountDownLatch對象內部計數器的值,一個線程調用countdown方法happen-before另外一個線程調用await方法

 

 

 方法四:同步屏障CyclicBarrier

 

 

 方法五:線程池

比如 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

 fixedThreadPool.shutdown();
          while (true) {//等待所有任務都執行結束
              if (fixedThreadPool.isTerminated()) {//所有的子線程都結束了
                  System.out.println("共耗時:"+(System.currentTimeMillis()-startTime)/1000.0+"s");
                  break;
              }
          }

注意:countDownLatch和cyclicBarrier有什么區別?

countDownLatch只能使用一次,而CyclicBarrier方法可以使用reset()方法重置,所以CyclicBarrier方法可以能處理更為復雜的業務場景。

我曾經在網上看到一個關於countDownLatch和cyclicBarrier的形象比喻,就是在百米賽跑的比賽中若使用 countDownLatch的話沖過終點線一個人就給評委發送一個人的成績,10個人比賽發送10次,如果用CyclicBarrier,則只在最后一個人沖過終點線的時候發送所有人的數據,僅僅發送一次,這就是區別。

 

參考:https://blog.csdn.net/m0_37125796/article/details/81105099


免責聲明!

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



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