2012-03-05 14 views
0

fixedThreadPoolから呼び出し可能な関数のリストを呼び出す際に問題があります。すべての呼び出し可能コードが実行されますが、それらのうちのいくつかは異なるスレッドに同時にディスパッチされるように見えるので、実際には複数回呼び出されます。ExecutorService invokeAll()が呼び出されている呼び出し可能番号

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例外をスローしたときにも、呼び出し元が2回呼び出される方法はわかりません。私はコンソールですべての例外を印刷する傾向があるので、私は彼らがとにかく行ったとは思わない。 – Renaud

答えて

0

おそらく、リストにあなたのCallableタスクの一部を重複しています:以下のコードを参照してください。すべてCallableの実装のメソッドを正しく実装するjava.util.Setを使用してみてください。

0

Callableがキャッチされない例外をスローした場合、その動作は未定義です。中断された例外については、たとえばExecutorServiceを停止します。また、incokeAllはコレクションを受け付けているので、ちょうどあなたが何を私はExecutorServiceのがちょうど呼び出さないかなり確信して

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

を重複していないことを確認することをお使いのArrayListのうち、HashSetのを構築し、それを渡します同じCallableは2回です。

関連する問題