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 Executor에서 동일한 기능을 수행하는 방법은 없습니다. 또한 코드가 마침내 스레드 풀을 닫으려면 블록 작성된 경우 물어보고 싶습니다?
덕분에, 미트
고맙습니다. trashgod,하지만 파싱해야하는 xml 노드의 정확한 개수가 없으므로 CountDownLatch를 사용할 수 없게됩니다. 하지만 자바에서 사용할 수있는 이러한 속성을 알지 못했기 때문에이 점에 대해 많은 감사를드립니다. – Amit
우수. 위에서 제안한 것처럼'Future'는 좀 더 유연하지만 UpDownLatch 예제에 대한 링크도 추가했습니다. – trashgod
관련 [예제] (http://stackoverflow.com/a/11372932/230513)도 참조하십시오. – trashgod