2011-07-01 3 views
1

잘 작동하는 코드베이스의 다른 곳에서는 매우 비슷한 다중 스레드 코드가 있지만 여기서 잘못된 점을 알 수는 없습니다.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의 크기가 증가하지 않는다고 보장 할 수 있습니다.

+0

"처리 결과"가 여러 번 표시됩니까? 디버거로 침입하면 어떻게됩니까? –

+0

while 루프를 영원히 돌릴 수 있습니까? 'index = getResultsIndex()'는 무엇을합니까? 어쩌면 0에서 size-1까지의 인덱스를 반환 할 것이므로 루프가 남지 않을 것입니다. – Howard

+0

또한,'allResults'의 선언과'getResultsIndex()'의 구현을 보여주십시오. 출력이 표시되지 않으면 교착 상태가 발생합니다. –

답변

1

나는 배열 tasks이의 길이를 가지고, 사실 관계가 가정 threads (즉, 귀하의 경우 2 개) 그러나 당신은 라인 내에서 더 많은 값을 할당

for (int i = 0; i < allResults.size(); i++) { 
    tasks[i] = ... 
    .... 
} 

목록 allResults하는 경우 스레드가 두 개 이상 입력 된 경우 ArrayIndexOutOfBoundsException에 의해 스레드가 중지됩니다. 어쩌면이 코드를 잡아낼 수도 있지만 제시 한 코드 밖에서 제대로 처리하지 마십시오.

+0

그 중 하나입니다, 정말 고마워요! – Ina

0

무한 루프가 발생하는 모든 루프 이후에 getResultsIndex()가 업데이트되지 않는 것처럼 보입니다.

+0

@Ina : 이것을 테스트하면 어떻게됩니까? –

+0

원본 게시물을 편집하여 getResultsIndex()를 표시했습니다. getResultsIndex()가 업데이트되지 않는 이유는 모르겠지만 동기화되고 무한대 (또는 적어도 Integer.MAX_VALUE까지 계산되지만 여전히 allResults.size()보다 큽니다). – Ina

0

코드에서 allResults와 getResultsIndex가 무엇인지는 명확하지 않지만 getResultsIndex가 반환하는 내용을 업데이트하지 않는 것으로 보입니다.

+0

코드에 대한 수정 된 게시물보기 – Ina

관련 문제