잘 작동하는 코드베이스의 다른 곳에서는 매우 비슷한 다중 스레드 코드가 있지만 여기서 잘못된 점을 알 수는 없습니다.ExecutorService가있는 Java의 다중 스레드 코드가 반환되지 않습니다. 그 이유는 무엇입니까?
이것은 검색 쿼리에 대한 결과 XML을 생성하는 간단한 멀티 스레드 프로세스입니다. 이 방법을 실행의 출력은 다음과 같습니다
스레드
라인에서 System.out.println ("완료 멀티 스레딩 루프")에서 반환; "에 도달하지 않습니다
수를 수정. 스레드의 도움이되지 않습니다
private void fillAllResults() {
int threads = 2;
final FutureTask[] tasks = new FutureTask[threads];
final ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < allResults.size(); i++) {
tasks[i] = new FutureTask<Integer>(new Callable<Integer>() {
public Integer call() throws Exception {
int index;
while ((index = getResultsIndex()) < allResults.size()) {
System.out.println("Processing result " + index);
Result result = allResults.get(index);
fillResultXML(result);
}
System.out.println("Returning from threads");
return 1;
}
});
executor.execute(tasks[i]);
}
for (int i = 0; i < threads; i++) {
try {
tasks[i].get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
System.out.println("Finished multithreading loop");
}
편집, 모든 빠른 답변 주셔서 감사합니다 여기에 대한 답변을 다음과 같습니다.!
을'처리 결과'가 여러 번 표시됩니다. allResults.size()가 25 인 경우, 처리 결과 (1), 처리 결과 2 ... 처리 결과를 보여줍니다 (24)
여기에 실종 여분의 코드입니다 :
private List<Result> allResults = new ArrayList<Result>();
private int resultsIndex = 0;
private synchronized int getResultsIndex() {
return resultsIndex++;
}
그리고 경우에 사람이 궁금있어, I 루프 내의 코드로 인해 allResults의 크기가 증가하지 않는다고 보장 할 수 있습니다.
"처리 결과"가 여러 번 표시됩니까? 디버거로 침입하면 어떻게됩니까? –
while 루프를 영원히 돌릴 수 있습니까? 'index = getResultsIndex()'는 무엇을합니까? 어쩌면 0에서 size-1까지의 인덱스를 반환 할 것이므로 루프가 남지 않을 것입니다. – Howard
또한,'allResults'의 선언과'getResultsIndex()'의 구현을 보여주십시오. 출력이 표시되지 않으면 교착 상태가 발생합니다. –