从这个答案中,我了解到Callable
和Runnable
之间的唯一区别是,以前可以返回执行的结果并抛出异常。
我不明白Executor
为什么不定义采用Callable
的方法:
void execute(Callable command);
从我的角度来看,为Runnable
和Callable
创建方法是合乎逻辑的。在ExecutorService
(Executor
的一个子接口)中,Runnable
和Callable
也有类似的submit()
方法。
请解释这个设计决定,因为我在互联网上找不到任何解释。
我不明白为什么
Executor
不定义采用Callable
的方法。
Executor
具有单一的责任 - 执行提交的任务。在此抽象级别上,仅使用Runnable
S的API不需要ExecutorService
提出的其他功能。
为
Runnable
和Callable
创建方法是合乎逻辑的。
是的,因此ExecutorService
接口是通过扩展Executor
设计的。ExecutorService
提供了显着差异 - 提供任务执行的结果。这就是添加Callable
,TimeUnit
和Lifecycle方法的原因。
我想执行器的设计是尽可能简单的,即使用一种方法。由于execute()没有提供任何获得结果的方法,因此它不接受可可式,并且只采用可运行的。
。另一方面,各种submit()函数返回期货,可用于获得结果(例如,从可召唤)或仅等待执行完成。因此,接受可运行和可召唤的人是有意义的。
执行者运行任务。如果您要管理如何以及何时运行任务,则需要它们。执行者不收集任务结果,因此仅支持Runnable
。
假设它们支持Callable
。那应该如何获取结果呢?T execute(Callable<T> command)
不是一个选项,因为它将阻止当前线程执行。因此,应该将其与一些T getResult()
或返回Future<T>
配对。为此,您的ExecutorService
带有方法<T> Future<T> submit(Callable<T> task)
。