Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中带ExecutorService的多线程代码无法返回,原因是什么?_Java_Multithreading_Executorservice - Fatal编程技术网

Java中带ExecutorService的多线程代码无法返回,原因是什么?

Java中带ExecutorService的多线程代码无法返回,原因是什么?,java,multithreading,executorservice,Java,Multithreading,Executorservice,在我的代码库的其他地方,我有非常相似的多线程代码,可以很好地工作,但我看不出这里出了什么问题 这是一个简单的多线程过程,用于为搜索查询生成一些结果XML。运行此方法的输出为: 从线程返回 行System.out.println(“完成的多线程循环”);“永远也达不到 修改线程数没有帮助 private void fillAllResults() { int threads = 2; final FutureTask[] tasks = new FutureTask

在我的代码库的其他地方,我有非常相似的多线程代码,可以很好地工作,但我看不出这里出了什么问题

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

从线程返回

行System.out.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");
    }
private void fillAllResults(){
int线程=2;
最终未来任务[]任务=新未来任务[线程];
final ExecutorService executor=Executors.newCachedThreadPool();
对于(int i=0;i
编辑,谢谢大家的快速回复!以下是答案:

显示“处理结果”的次数与显示结果的次数相同。如果allResults.size()为25,则显示处理结果1、处理结果2…处理结果24

以下是缺少的额外代码:

private List<Result> allResults = new ArrayList<Result>();
private int resultsIndex = 0;

private synchronized int getResultsIndex() {
return resultsIndex++;
}
private List allResults=new ArrayList();
私有int resultIndex=0;
私有同步int-getResultIndex(){
返回结果index++;
}

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

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

看起来GetResultIndex()很像没有在每次循环后更新,导致无限循环。

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

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

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

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

如果您的列表
allResults
包含两个以上的条目,您的线程将被
ArrayIndexOutOfBoundsException
停止。可能您捕捉到了这一条,但没有在显示的代码之外正确处理它。

我想这与以下事实有关,即您的数组
任务
的长度为
线程
(即,在您的情况下为两个),但您在行内为其指定了更多值

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

如果您的列表
allResults
包含两个以上的条目,您的线程将被
ArrayIndexOutOfBoundsException
停止。可能您捕捉到了这一条,但未在显示的代码之外正确处理它。

是否显示“处理结果”“多次?如果使用调试器闯入会发生什么?永远运行while循环?什么是
index=getResultsIndex()
do?可能它会返回从零到大小1的索引,因此循环永远不会消失?另外,请显示
allResults
的声明和
getResultsIndex()的实现。”
。如果您没有看到任何输出,则会出现死锁。我通过编辑原始帖子来回答-我不认为这是一个无限循环,但可能是错误的。感谢您的帮助。这可能不是原因,但如果其他线程看到最新值,ResultIndex可能会不稳定。它是否显示“处理结果”多次?如果使用调试器闯入会发生什么?永远运行while循环?什么是
index=getResultsIndex()
do?可能它会返回从零到大小1的索引,因此循环永远不会离开?另外,请显示
allResults
的声明和
getResultsIndex()的实现
。如果你看不到任何输出,那么你就出现了死锁。我通过编辑原始帖子来回答-我不认为这是一个无限循环,但我可能是错的。谢谢你的帮助。这可能不是原因,但如果其他线程看到最新的值,ResultIndex可能是不稳定的。@Ina:当你测试是吗?我编辑了原始帖子以显示GetResultIndex()。我不明白为什么GetResultIndex()不会更新,它是同步的,并且计数无穷大(或者至少是Integer.MAX_值,但仍然比allResults.size()大)。@Ina:测试这个时会发生什么?我编辑了原始帖子以显示GetResultIndex()。我不明白为什么GetResultIndex()不会更新,它是同步的,并且计数为无穷大(或者至少是Integer.MAX_值,但仍然比allResults.size()大)。