一尘不染

是否应该将Callable优先于Runnable?

java

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

我的问题是,现在我们有了Callable接口,我们应该一直使用吗?不使用Callable和使用的用例是Runnable什么?


阅读 243

收藏
2020-12-03

共1个答案

一尘不染

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

可调用程序可以抛出异常并返回值,这使它们成为更好的抽象方法,用于承载结果的任务(例如,从网络中获取资源,执行昂贵的值计算等)[摘自Goetz的 Java
Concurrency in Practice
,布洛赫(Bloch)等。等,关于Java并发的标准工作]。

因此,如果您正在设计API,建议您尽可能使用Callables。如果您确定任务不会返回值并且不会引发异常,那么Runnable也是一个有效的选择。这里没有黑色和白色,尤其是因为Runnable可以轻松地包装在Callables中,反之亦然。

另外,请注意您的Callable实现无需声明throws Exception;Callable本身声明它的事实仅是允许实现者抛出任何检查的异常。但是,仅依赖Callable接口的Callable调用者将不得不编写异常处理代码。
还要注意,Callables不需要返回值;您只需声明您的Callable即可返回Void(大写的’ V‘)。

2020-12-03