使用ExecutorService在Java中执行多线程代码时无法返回,原因是什么?
在我的代码库的其他地方,我有非常相似的多线程代码,可以很好地工作,但我看不出这里出了什么问题
这是一个简单的多线程过程,用于为搜索查询生成一些结果XML。运行此方法的输出为:
Returning from threads
线路系统。出来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");
}
编辑,谢谢大家的快速回复!以下是答案:
它显示“处理结果”的次数与我显示结果的次数一样多。如果一切顺利的话。size()是25,它显示处理结果1,处理结果2。。。处理结果24
以下是缺少的额外代码:
private List<Result> allResults = new ArrayList<Result>();
private int resultsIndex = 0;
private synchronized int getResultsIndex() {
return resultsIndex++;
}
如果有人想知道,我可以保证循环中的任何代码都不会增加所有结果的大小
# 1 楼答案
代码中不清楚allResults和getResultsIndex是什么,但您似乎从未更新getResultsIndex返回的任何内容
# 2 楼答案
看起来GetResultIndex()在每次循环后都不会更新,从而导致无限循环
# 3 楼答案
我认为这与这样一个事实有关,即数组
tasks
的长度为threads
(即,在您的例子中为两个),但您在行内为其分配了更多值如果你的列表
allResults
有两个以上的条目,你的线程将被一个ArrayIndexOutOfBoundsException
停止。也许你抓住了这个问题,但在你给出的代码之外没有正确处理它