我正在使用ThreadPoolExecutor在我的Java應用程序中實現線程。如何使主線程等待其他線程在ThreadPoolExecutor中完成
我有一個XML,我需要解析並將它的每個節點添加到線程來執行完成。我的實現是這樣的:
parse_tp是創建的線程池對象& ParseQuotesXML是帶有run方法的類。
try {
List children = root.getChildren();
Iterator iter = children.iterator();
//Parsing the XML
while(iter.hasNext()) {
Element child = (Element) iter.next();
ParseQuotesXML quote = new ParseQuotesXML(child, this);
parse_tp.execute(quote);
}
System.out.println("Print it after all the threads have completed");
catch(Exception ex) {
ex.printStackTrace();
}
finally {
System.out.println("Print it in the end.");
if(!parse_tp.isShutdown()) {
if(parse_tp.getActiveCount() == 0 && parse_tp.getQueue().size() == 0) {
parse_tp.shutdown();
} else {
try {
parse_tp.awaitTermination(30, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
log.info("Exception while terminating the threadpool "+ex.getMessage());
ex.printStackTrace();
}
}
}
parse_tp.shutdown();
}
的問題是,這兩個打印輸出語句中的其他線程退出之前被打印出來。我想讓主線程等待所有其他線程完成。 在正常的線程實現中,我可以使用join()函數來完成,但沒有辦法在ThreadPool執行程序中實現同樣的功能。還想問一下,如果finally代碼寫入的代碼關閉了threadpool本身?
感謝, 阿米特
感謝trashgod,但我沒有確切的XML節點的數量,我需要解析,所以不會能夠使用CountDownLatch。但是我沒有意識到Java中有這樣的屬性,所以非常感謝。 – Amit 2009-12-18 10:28:27
非常好。如上所述,「Future」更加靈活,但我也添加了UpDownLatch示例的鏈接。 – trashgod 2009-12-18 22:06:05
另請參閱此相關的[示例](http://stackoverflow.com/a/11372932/230513)。 – trashgod 2012-09-27 03:47:13