我已经了解了Java Runnable和Callable接口之间的区别。从Java 1.5开始,已将其他功能添加到Runnable接口,并已调用这些功能Callable以保持向后兼容性。
Runnable
Callable
我的问题是,现在我们有了Callable接口,我们应该一直使用吗?不使用Callable和使用的用例是Runnable什么?
两者都有其用途,并且都由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‘)。
throws Exception
Void
V