在Java中设计并发线程时,使用Runnable接口和Callable接口有什么区别,为什么你会选择其中一个而不是另一个?
当前回答
Callable和Runnable之间的区别如下:
在JDK 5.0中引入了Callable,而在JDK 1.0中引入了Runnable 可调用对象有call()方法,而Runnable有run()方法。 可调用对象有返回值的call方法,而可运行对象有不返回任何值的run方法。 调用方法可以抛出检查异常,但运行方法不能抛出检查异常。 可调用的使用submit()方法放入任务队列,可运行的使用execute()方法放入任务队列。
其他回答
oracle文档中这些接口的用途:
可运行接口应该由任何类实现,其实例将由线程执行。该类必须定义一个名为run的无参数方法。
可调用:返回结果并可能抛出异常的任务。实现者定义一个不带参数的方法叫做call。 Callable接口与Runnable接口类似,因为两者都是为其实例可能由另一个线程执行的类设计的。然而,Runnable不返回结果,也不能抛出受控异常。
其他的差异:
You can pass Runnable to create a Thread. But you can't create new Thread by passing Callable as parameter. You can pass Callable only to ExecutorService instances. Example: public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void main(String args[]) { (new Thread(new HelloRunnable())).start(); } } Use Runnable for fire and forget calls. Use Callable to verify the result. Callable can be passed to invokeAll method unlike Runnable. Methods invokeAny and invokeAll perform the most commonly useful forms of bulk execution, executing a collection of tasks and then waiting for at least one, or all, to complete Trivial difference : method name to be implemented => run() for Runnable and call() for Callable.
可调用的和可运行的都彼此相似,可以在实现线程中使用。在实现Runnable的情况下,你必须实现run()方法,但在可调用的情况下,你必须实现call()方法,这两种方法的工作方式相似,但可调用的call()方法有更大的灵活性。他们之间有一些不同。
Runnable和callable之间的区别如下所示
1) runnable的run()方法返回void,这意味着如果你想让你的线程返回一些你可以进一步使用的东西,那么你没有选择runnable run()方法。有一个解决方案'Callable',如果你想返回任何形式的对象,那么你应该使用Callable而不是Runnable。可调用接口有方法'call()',该方法返回Object。
方法签名- 可运行- >
public void run(){}
可调用的- - - >
public Object call(){}
2)对于Runnable run()方法,如果出现任何检查异常,那么你必须用try catch块处理,但对于Callable call()方法,你可以抛出检查异常,如下所示
public Object call() throws Exception {}
3) Runnable来自遗留的java 1.0版本,而callable来自java 1.5版本的Executer框架。
如果你熟悉Executers,那么你应该使用Callable而不是Runnable。
希望你能理解。
请看这里的解释。
Callable接口类似于 可运行的,因为两者都是设计出来的 对于实例为的类 可能由另一个人执行 线程。然而,Runnable则不然 返回结果,且不能抛出 检查异常。
Callable和Runnable之间的区别如下:
在JDK 5.0中引入了Callable,而在JDK 1.0中引入了Runnable 可调用对象有call()方法,而Runnable有run()方法。 可调用对象有返回值的call方法,而可运行对象有不返回任何值的run方法。 调用方法可以抛出检查异常,但运行方法不能抛出检查异常。 可调用的使用submit()方法放入任务队列,可运行的使用execute()方法放入任务队列。
Runnable和Callable在应用程序中的区别是什么?是否只与返回参数在Callable中存在差异?
基本上,是的。请看这个问题的答案。Callable的javadoc。
如果Callable能做Runnable能做的所有事情,那么两者都需要什么呢?
因为Runnable接口不能做Callable所做的所有事情!
Runnable has been around since Java 1.0, but Callable was only introduced in Java 1.5 ... to handle use-cases that Runnable does not support. In theory, the Java team could have changed the signature of the Runnable.run() method, but this would have broken binary compatiblity with pre-1.5 code, requiring recoding when migrating old Java code to newer JVMs. That is a BIG NO-NO. Java strives to be backwards compatible ... and that's been one of Java's biggest selling points for business computing.
显然,在某些用例中,任务不需要返回结果或抛出检查过的异常。对于这些用例,使用Runnable比使用Callable<Void>和从call()方法返回一个虚拟(null)值更简洁。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 自动化invokerrequired代码模式
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder