Java中Runnable和Callable接口之间的区别
在Java中设计并发线程时,使用Runnable和Callable接口有什么区别,为什么我们要选择一个呢?
解决方案
请参阅此处的说明。
The Callable interface is similar to Runnable, in that both are designed for classes whose instances are potentially executed by another thread. A Runnable, however, does not return a result and cannot throw a checked exception.
我在另一个博客中发现了这一点,可以进一步解释这些差异:
尽管两个接口都是由希望在不同的执行线程中执行的类实现的,但是两个接口之间的区别很少:
- 一个Callable <V>实例返回类型为V的结果,而一个Runnable实例则没有。
- 一个Callable <V>实例可能会抛出检查异常,而一个Runnable实例则不会。
Java的设计人员认为有必要扩展Runnable接口的功能,但是他们不想影响Runnable接口的使用,这可能就是他们之所以拥有一个单独的名为``的接口的原因。与更改现有的" Runnable"相比,Java 1.5中的" Callable"更是如此。
What are the differences in the applications of Runnable and Callable. Is the difference only with the return parameter present in Callable?
基本上是。查看此问题的答案。还有用于Callable的javadoc。
What is the need of having both if Callable can do all that Runnable does?
因为"可运行"界面无法完成"可调用"所能做的一切!
从Java 1.0开始,可运行(Runnable)就出现了,但是可调用(Callable)仅在Java 1.5中引入了...以处理可运行(Runnable)不支持的用例。从理论上讲,Java团队可以更改Runnable.run()方法的签名,但这将破坏与1.5版之前的代码的二进制兼容性,因此在将旧的Java代码迁移到较新的JVM时需要重新编码。那是很大的不。 Java致力于向后兼容...这一直是Java商业计算的最大卖点之一。
而且,很明显,在某些用例中,任务不需要返回结果或者引发检查异常。对于这些用例,使用Runnable会比使用Callable <Void>并从call()方法返回一个哑元(null)值更简洁。
正如这里已经提到的,Callable是一个相对较新的接口,它是作为并发包的一部分引入的。 Callable和Runnable均可与执行程序一起使用。类线程(本身实现Runnable)仅支持Runnable。
我们仍然可以将Runnable与执行程序一起使用。 Callable的优点是我们可以将其发送给执行者,并立即取回Future结果,该结果将在执行完成后进行更新。 Runnable可以实现相同的功能,但是在这种情况下,我们必须自己管理结果。例如,我们可以创建将保存所有结果的结果队列。其他线程可以在此队列上等待并处理到达的结果。