Callable是否优先于Runnable?

2022-09-01 04:34:03

我已经理解了Java中和接口之间的区别。从Java 1.5开始,接口中添加了其他功能,并调用了这些功能以保持向后兼容性。RunnableCallableRunnableCallable

我的问题是,现在我们有接口了,我们应该一直使用它吗?不使用和使用有哪些用例?CallableCallableRunnable

(这是一篇关于它们之间有什么区别的好文章)


答案 1

两者都有其用途,并且都由java.util.concurrent中的Executor框架支持。Runnable已经存在了更长的时间,但它仍然在使用中,并没有气馁。

Callables可以抛出异常和返回值,这使得它们成为结果承载任务(例如从网络中获取资源,执行昂贵的值计算等)的更好抽象[来自Goetz,Bloch等人的Java Concurrency in Practice,Java并发的标准工作]。

所以,如果你正在设计一个API,我建议在可能的情况下使用Callables。如果您确定任务不会返回值也不会引发异常,则 Runnables 也是一个有效的选择。这里没有黑白分明,特别是因为Runnables可以很容易地包装在Callables中,反之亦然。

顺便说一句,请注意,您的可调用实现不需要声明 ;Callable本身声明它只是为了允许实现者抛出任何检查的异常。但是,仅依赖可调用接口的 Callable 的调用方必须编写异常处理代码。
另请注意,可调用对象不需要返回值;您可以简单地声明您的可调用返回(大写字母“”)。throws ExceptionVoidV


答案 2

恕我直言,Runnable是一种更好的类型,当作为参数时,它是一个函数

  • 没有返回值,但只有副作用
  • 必须处理异常,而不是传播它们

不要忘记抛出异常。这意味着,如果您将 Callable 作为参数,则此 Callable 可以引发任何类型的异常,并且您必须有一种方法以正确的方式处理它们。如果你不能做到这一点,最好让 Callable 的实现者按照他想要的方式处理异常,并使参数成为 Runnable 以明确这一点。Callable.call()


推荐