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

Why Executor interface doesn't have a method, which takes Callable as a parameter?

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

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

的方法
void execute(Callable command);

在我看来,为 RunnableCallable 创建方法是合乎逻辑的。 ExecutorServiceExecutor 的子接口,RunnableCallable 都有类似的 submit() 方法。

请解释一下这个设计决定,因为我在 Internet 上找不到任何解释。

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

另一方面,各种 submit() 函数 return Futures,可用于获取结果(例如从 Callable 中),或简单地等待执行完成。因此,同时接受 Runnable 和 Callable 是有意义的。

执行者 运行 任务。如果您想管理任务的执行方式和时间 运行,则需要它们。执行器不收集任务结果,因此仅支持 Runnable

假设他们支持 Callable。那么应该如何获取结果呢? T execute(Callable<T> command) 不是一个选项,因为它会阻止当前线程执行。所以应该搭配一些T getResult()或者returnFuture<T>。为此你有 ExecutorService 方法 <T> Future<T> submit(Callable<T> task).

I don't understand why Executor doesn't define a method which takes a Callable.

Executor 有一项职责 - 执行提交的任务。在此抽象级别上,仅使用 Runnables 的 API 不需要 ExecutorService.

提出的附加功能

It'd be logical to create methods for both Runnable and Callable.

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