为什么执行器接口没有将 Callable 作为参数的方法?



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

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

void execute(Callable command);

从我的角度来看,为RunnableCallable创建方法是合乎逻辑的。在ExecutorServiceExecutor的一个子接口)中,RunnableCallable也有类似的submit()方法。

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

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

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

RunnableCallable创建方法是合乎逻辑的。

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

我想执行器的设计是尽可能简单的,即使用一种方法。由于execute()没有提供任何获得结果的方法,因此它不接受可可式,并且只采用可运行的。

另一方面,各种submit()函数返回期货,可用于获得结果(例如,从可召唤)或仅等待执行完成。因此,接受可运行和可召唤的人是有意义的。

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

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

相关内容

  • 没有找到相关文章

最新更新