方法一:用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