我的代码库中其他地方有非常相似的多线程代码,它们运行良好,但我看不出这里出了什么问题。
这是一个简单的多线程过程,用于为搜索查询生成一些结果 XML。运行此方法的输出是:
从线程返回
线 System.out.println("Finished multithreading loop");" 永远不会到达。
修改线程数没有帮助。
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 的大小。