executor.invokeAll()没有完成执行

时间:2015-12-26 00:23:37

标签: java multithreading java-8 java-stream executorservice

所以我试图在#34;玩具语言上实现某种分叉"。它就像实现我自己的编译器一样。因此,当用户执行fork时,我的程序应该启动/模拟一些线程。 在我的代码中,我准备了callables然后我开始执行callables但是当我使用invokeAll时我的程序没有终止,它只是没有做任何事情。

我通过调试运行代码,它只是在我调用invokeAll()时停止调试,但它没有终止或抛出错误或任何东西(我在try-catch中调用)。我也尝试使用固定线程池。它什么都不做

一些代码:

// preparing the callables
java.util.List<Callable<MyClass>> callList = prgll.stream()
        .map(p -> (Callable<MyClass>) () -> {
    return p.oneStep(); //a method from my class
}).collect(Collectors.toList());

//start the execution of the callables
//it should return the list of new created threads
ExecutorService executor = Executors.newSingleThreadExecutor();
java.util.List<MyClass> fff;
try {
    fff = executor.invokeAll(callList).stream() // here my program gets blocked but not all the time, only when I call use myFork class
    .map(future-> {
        try {
            return future.get();
        } catch (Exception e) {
            e.printStackTrace();
            throw new CustomException("Error in onestepforall" + e.getMessage());
        }
    }).filter(p->p != null).collect(Collectors.toList());

} catch (InterruptedException e) {
    e.printStackTrace();
    throw new CustomException("Error while trying executor" +e.getMessage());
}

我可以调试这个以深入了解我的代码,看看为什么invokeAll保持待机状态?

我也尝试从新的SingleThread更改为固定池,但它仍然没有做任何事情。

2 个答案:

答案 0 :(得分:2)

invokeAll()是一种阻止方法,即等到所有期货都已完成。

.map通过执行者submit()的可调用列表,而不是您想要异步任务提交。

如果您的问题是任务未完成的原因,那么您不想调试提交给执行程序的线程,而是生成线程,因为任务是在单独的线程上执行的。您可以使用附加的调试器暂停整个JVM,然后查看各个线程,而不是使用断点。

答案 1 :(得分:0)

我发现了问题。 p.oneStep()从未为fork完成,因为方法内部存在无限循环。我摆脱它,其他一切正常。