1

我的代码库中其他地方有非常相似的多线程代码,它们运行良好,但我看不出这里出了什么问题。

这是一个简单的多线程过程,用于为搜索查询生成一些结果 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 的大小。

4

3 回答 3

1

我想这与以下事实有关,即您的数组tasks的长度为threads(即在您的情况下为两个),但您在行内为其分配了更多值

for (int i = 0; i < allResults.size(); i++) {
    tasks[i] = ...
    ....
}

如果您的列表allResults有两个以上的条目,您的线程将被ArrayIndexOutOfBoundsException. 也许您抓住了这个,但在您提供的代码之外没有正确处理它。

于 2011-07-01T15:51:05.283 回答
0

It looks like getResultsIndex() isn't updating after every loop resulting in an infinite loop.

于 2011-07-01T14:41:55.363 回答
0

从您的代码中不清楚 allResults 和 getResultsIndex 是什么,但您似乎永远不会更新 getResultsIndex 返回的任何内容。

于 2011-07-01T14:52:31.497 回答