2011-11-23 13 views
0

我的Java应用程序使用java.util.concurrent.Executors.newCachedThreadPool()来启动执行不同工作的多个不同线程。我是否需要在Future上做一个future.get(),它不会返回我关心的值?

某些线程返回一个值。对于这些,我使用Future.get()从线程检索值。

其他线程不返回我关心的值。他们被宣布返回Object,返回的值始终为null。对于这些线程,我目前调用Future.get()即使没有价值。这是必要的,还是没有意义?我的想法是,或许Future.get()通知线程池,我完成了这个线程。

回答

1

简短的回答是没有。然而,如果你想检查一切成功完成,Future.get()会让你知道是否有ExecutionException(通过抛出它)。所以我通常会这么称呼,即使没有我关心的“结果”。 YMMV取决于你如何进行错误处理。

正如汤姆安德森提到的,Callable<Void>是一个提醒人们没有“结果”的选项。但坦率地说,对于Executor而言,我的可卡因几乎总是会回归自己,所以如果需要的话,您可以真正地检查结果。例如(稍显夸张)

public class LongCalculation implements Callable<LongCalculation> { 

    public double getResult() { ... } 
    public SomeEnum getStatus() { ... } // e.g. FAILED, SUCCESS, CANCELLED 
    public List<String> getAnythingWeirdThatHappenned() { ... } 
} 
1

在调用Future.get()对可返回null的可调用任务上没有任何问题。请记住,Future.get()会阻止调用线程执行。通过这样做,你确实使工作线程与调用线程同步运行。正如名称所述,Future.get()从未来获得某些东西,因此调用线程需要等待。

0

据我所知,文件没有提到此事。但这意味着没有什么说你需要这样做。如果你确实需要这将是非常奇怪的 - 这会很容易意外地通过忘记搞砸了一个线程池。

顺便说一句,这些无返回物的Callables的流行选择是Callable<Void>。无效为an uninstantiable placeholder class,所以对于只有空值的变量来说,这是个不错的选择。

相关问题