为什么 Executor 接口没有一个以 Callable 为参数的方法?
Why Executor interface doesn't have a method, which takes Callable as a parameter?
从这个answer我了解到Callable
和Runnable
之间的唯一区别是前者可以return执行的结果并抛出异常。
我不明白为什么 Executor
没有定义采用 Callable
:
的方法
void execute(Callable command);
在我看来,为 Runnable
和 Callable
创建方法是合乎逻辑的。 ExecutorService
是 Executor
的子接口,Runnable
和 Callable
都有类似的 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
有一项职责 - 执行提交的任务。在此抽象级别上,仅使用 Runnable
s 的 API 不需要 ExecutorService
.
提出的附加功能
It'd be logical to create methods for both Runnable
and Callable
.
是的,因此 ExecutorService
接口是通过扩展 Executor
设计的。 ExecutorService
提供了显着差异 - 提供任务执行的结果。 这就是添加 Callable
、TimeUnit
和生命周期方法的原因。
从这个answer我了解到Callable
和Runnable
之间的唯一区别是前者可以return执行的结果并抛出异常。
我不明白为什么 Executor
没有定义采用 Callable
:
void execute(Callable command);
在我看来,为 Runnable
和 Callable
创建方法是合乎逻辑的。 ExecutorService
是 Executor
的子接口,Runnable
和 Callable
都有类似的 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 aCallable
.
Executor
有一项职责 - 执行提交的任务。在此抽象级别上,仅使用 Runnable
s 的 API 不需要 ExecutorService
.
It'd be logical to create methods for both
Runnable
andCallable
.
是的,因此 ExecutorService
接口是通过扩展 Executor
设计的。 ExecutorService
提供了显着差异 - 提供任务执行的结果。 这就是添加 Callable
、TimeUnit
和生命周期方法的原因。