为什么Executor接口没有一个将Callable作为参数的方法?

时间:2017-11-22 11:49:45

标签: java concurrency executorservice callable

从这个answer我了解到,CallableRunnable之间的唯一区别是前者可以返回执行结果并抛出异常。

我不明白为什么Executor没有定义采用Callable的方法:

void execute(Callable command);

从我的观点来看,为RunnableCallable创建方法是合乎逻辑的。在ExecutorService Executor的子接口中,submit()Runnable都有类似的Callable方法。

请解释这个设计决定,因为我在互联网上找不到任何解释。

3 个答案:

答案 0 :(得分:2)

我认为Executor设计应该尽可能简单,即使用一种方法。由于execute()没有提供任何获取结果的方法,因此它不接受Callables,只接受Runnables。

另一方面,各种submit()函数返回Futures,它可用于获取结果(例如来自Callable),或者只是等待执行完成。因此,接受Runnable和Callable都是有意义的。

答案 1 :(得分:2)

执行人员运行任务。如果要管理应该如何以及何时运行任务,则需要它们。执行者不收集任务结果,因此仅支持Runnable

假设他们支持Callable。那么如何获取结果呢? T execute(Callable<T> command)不是一个选项,因为它会阻止当前的线程执行。因此,它应与某些T getResult()配对或返回Future<T>。为此,您ExecutorService使用方法<T> Future<T> submit(Callable<T> task)

答案 2 :(得分:2)

  

我不明白为什么Executor没有定义一个Callable的方法。

Executor只有一个责任 - 执行提交的任务。在此抽象级别上,仅使用Runnable的API不需要ExecutorService提出的其他功能。

  

RunnableCallable创建方法符合逻辑。

是的,因此ExecutorService界面是通过扩展Executor来设计的。 ExecutorService提供了显着的差异 - 提供任务执行结果。这就是添加CallableTimeUnit和生命周期方法的原因。< / p>