原文出處:http://blog.chenlb.com/2008/11/join-or-countdownlatch-make-main-thread-wait-all-sub-thread.html
在編寫多線程的工作中,有個常見的問題:主線程(main) 啟動好幾個子線程(task)來完成并發任務,主線程要等待所有的子線程完成之后才繼續執行main的其它任務。
默認主線程退出時其它子線程不會停,如果想讓main退出時其它子線程終止,可以用subThread.setDaemon(true) 設置子線程為“守護線程”。但現在要的是主線程等待所有子線程完成后,還要執行其它操作(比如:結果合并)。記得可以用join()方法來等待所有子線程完成后,才繼續執行。如果不用join(),main線程與子線程是并發的,要稍加處理使main線程暫停。簡單點用Thread.sleep(long millis) 了,當然用“等待-通知”機制也可以。
下面是用join的實現main等待所有子線程完成了,示例代碼:WaitAllSubThread.java。
























































































如果不用join,上面的代碼會使先輸出“main run end”,原因是:main 與 所有sub thread并發工作,不等待所有子線程繼續工作。而所有子線程完成了,main線程才會退出。
用比較笨的方式:把上面/* */的注釋去掉,把 th.join();塊注釋掉。這樣可以使等待所有子線程完成了才去執行其它后續的(比如:這里是輸出“main run end”)。分析:程序中加工作的子線程的計數(liveThreadNum)。main不斷輪詢是否所有子線程完成,所有完成就執行剩下的。
上面的是昨天寫的,今天發現一個更加簡潔的方式去處理main線程阻塞(等待所有子線程),那就是java.util.concurrent.CountDownLatch類。現在重新實現上面的功能,CountDownLatchUse.java

































































CountDownLatch.countDown();完成線程的計數。CountDownLatch.await();完成了主線程阻塞。簡潔就是好,以后就這種方式了。