有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用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++;
}

如果有人想知道,我可以保证循环中的任何代码都不会增加所有结果的大小


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    看起来GetResultIndex()在每次循环后都不会更新,从而导致无限循环

  3. # 3 楼答案

    我认为这与这样一个事实有关,即数组tasks的长度为threads(即,在您的例子中为两个),但您在行内为其分配了更多值

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

    如果你的列表allResults有两个以上的条目,你的线程将被一个ArrayIndexOutOfBoundsException停止。也许你抓住了这个问题,但在你给出的代码之外没有正确处理它