java - Java 中使用 ExecutorService 的多线程代码无法返回,为什么?

标签 java multithreading executorservice

我的代码库中的其他地方有非常相似的多线程代码,工作正常,但我看不出这里出了什么问题。

这是一个简单的多线程进程,用于为搜索查询生成一些结果 XML。运行该方法的输出是:

Returning from threads

永远不会到达 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 的大小。

最佳答案

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

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

如果您的列表 allResults 包含两个以上条目,您的线程将被 ArrayIndexOutOfBoundsException 停止。也许您发现了这个问题,但没有在您提供的代码之外正确处理它。

关于java - Java 中使用 ExecutorService 的多线程代码无法返回,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549372/

相关文章:

java - 迭代时从集合中删除元素

java - jasper 使用 applet 和 servlet 打印 loadObject

java - 调用两个同步方法时死锁

c# - 全局类实例计数(使用信号量)

java - 如何在执行程序服务中获取队列中的任务数?

java - Android - 使用现有 XML 布局动态添加项目到 ListView?

后跟 exec 时的克隆、 fork 、vfork 行为

java - 为什么 ExecutorService.awaitTermination() 在提交的任务完成之前成功

java.util.concurrent:从Runnable接口(interface)过渡到Executor接口(interface)

java - 部分记录未插入数据库表中