私は非常によく似ているコードベースのどこか他の場所にあるマルチスレッドコードを持っていますが、ここで何がうまくいかないのかよく分かりません。JavaのExecutorServiceでマルチスレッド化されたコードが返されないのはなぜですか?
これは、検索クエリに対していくつかの結果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++;
}
そして場合には、誰もが疑問に思っていますが、私は、ループ内のコードがallResultsのサイズを増加させないことを保証できます。
"処理結果"が何回表示されますか?あなたがデバッガで侵入したらどうなりますか? –
whileループを永遠に実行しますか? 'index = getResultsIndex()'は何をしますか?たぶん0からsize-1までのインデックスを返すので、ループは決して残らないでしょうか? – Howard
また、 'allResults'の宣言と' getResultsIndex() 'の実装を示してください。出力が表示されない場合は、デッドロックが発生します。 –