【发布时间】:2017-10-09 11:35:36
【问题描述】:
我正在寻找一种处理javafx.concurrent.Task 的方法,可以用java.util.concurrent.Callable 和ExecutorService.invokeAll(Collection<? extends Callable<T>>) 完成什么此方法不能与Tasks 一起使用,因为它们是runnables 而不是callables。
使用Executors.callable(Runnable task) 将我的任务类型转换为Callable 不起作用,因为返回的Callable 将始终返回null,而我需要从Task.call() 返回的值。
我了解Task 并非设计用于Collections。但是我需要在我的 JavaFX 应用程序中使用 Task,并通过编写测试遇到了这个问题。
除了简单地让我的Task 实现Callable 之外,还有其他方法可以规避这个问题吗?我不想这样做,因为我会更改我的代码以适应我的测试。
【问题讨论】:
-
您说的是
Runnable和Callable。重写你的问题,使它比现在更清楚。另外,解释一下让你的任务实现Callable有什么问题。 -
我做了,你明白这件事了吗?
-
是的,从这里bugs.openjdk.java.net/browse/JDK-8166449 我们可以看到实现
Callable并不是一个好主意。我稍微编辑了您的问题以突出差异。 -
你不能把所有的任务都包装在一个
Callable中,比如exec.invokeAll(tasks.stream().map(t -> () -> {t.run(); return t.getValue();}).collect(toList()));
标签: java javafx concurrency task executorservice