2012-03-05 6 views
0

fixedThreadPool에서 호출 가능 목록을 호출 할 때 문제점이 있습니다. 모든 callable이 실행되는 동안, 그것들 중 일부는 다른 스레드에 동시에 디스패치되어 실제로 한 번 이상 호출됩니다.ExecutorService invokeAll() duplicates 호출중인 호출 가능

try { 
    ExecutorService es = Executors.newFixedThreadPool(Environment.nThreads); 
    es.invokeAll(Environment.jobPool); 
    es.shutdown(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+1

ExecutorService에 전달한 컬렉션에 동일한 작업을 여러 번 추가하지 않으시겠습니까? 또한 귀하의 작업 중 실행 중에 예외가 발생하지 않도록 하시겠습니까? –

+3

이 코드 조각에 문제가 있다고 상상하기 어렵습니다. 'Environment.jobPool'은 어떻게 구성되어 있습니까? –

+0

이것은 jobPool이 작성된 코드 부분입니다. public static final ArrayList > jobPool = new ArrayList >(); 여기에 작업이 추가됩니다. Environment.jobPool.add (Executors.callable (new Job (eval, validator))); @Andrei 예외를 throw 할 때도 호출 가능 함수가 두 번 호출되는 것을 볼 수 없습니다. 나는 콘솔에서 모든 예외를 인쇄하는 경향이 있기 때문에 어쨌든 그들은 그렇게하지 않았다고 생각합니다. – Renaud

답변

0

당신은 아마 목록에서 Callable 작업의 일부를 복제 한 : 아래의 코드를 참조하십시오. java.util.SetCallable 구현의 equal 메소드를 올바르게 구현해보십시오.

0

호출 가능이 포착되지 않은 예외를 throw하면 그 동작은 정의되지 않습니다. 중단 된 예외의 경우 예를 들어 ExecutorService를 중지합니다. incokeAll이 컬렉션을 허용하기 때문에, 당신은 아무것도

Set<?> set = new HashSet<?>(jobPool); 

내가 ExecutorService입니다 단지를 호출하지 않습니다 확신 중복이없는 있는지 확인하기 위해 당신의 ArrayList를 밖으로 HashSet의를 구축하고 통과 동일한 Callable 두 번.