Java中Runnable和Callable比较
时间:2020-01-09 10:35:12 来源:igfitidea点击:
Java编程语言提供了两种方法来实现一个类,该类的实例将由线程执行。
- 通过实现Runnable接口
- 通过实现Callable接口
由于有两种选择,因此它们在提供的功能上必须有所不同,这就是我们将在本文中讨论的内容; Java中Runnable和Callable之间的区别。
Java中Runnable和Callable区别
1 Java编程语言的一部分
从Java 1.0开始就有可运行的接口。
Java 1.5中添加了Callable接口
2接口方法
可运行接口具有单个方法run(),方法签名如下。
public interface Runnable { public abstract void run(); }
可调用接口具有单个方法call(),这是具有方法签名的通用方法,如下所示。
public interface Callable<V> { V call() throws Exception; }
3返回值
这是Java中Runnable和Callable之间的主要区别之一。 Runnable不会返回结果。从run方法的方法签名中可以看到,返回类型为void。
Callable可以返回结果。在创建Callable实例时提供了结果的返回类型。
例如,一个Callable返回String。
Callable<String> callableObj = new Callable<String>() { @Override public String call() throws Exception { return "Hello"; } };
4异常处理
由于Runnable的run方法不包含throws子句,因此Runnable不可能抛出已检查的异常。
执行Runnable导致编译后错误"异常IOException与Runnable.run()中的throws子句不兼容",因为IOException是已检查的异常。
Runnable runnable = new Runnable() { @Override public void run() throws IOException{ } };
但是可以抛出RunTimeException。
public void run() throws RuntimeException{ }
Callable的call方法确实包含throws子句V call()throws Exception;
因此Callable可能会抛出一个已检查的异常。
Callable<String> callable = new Callable<String>() { @Override public String call() throws InterruptedException { return "Hello"; } };
5如何执行。
要执行可运行任务,可以使用以下选项之一:
- 线程类具有一个构造函数,我们可以在其中传递Runnable作为参数。
- 我们可以使用Executor界面的execute方法来运行Runnable任务。
- 我们可以使用ExecutorService接口的Submit方法运行Runnable任务。
要执行Callable任务,Thread类不提供任何支持,但并发API提供以下选项:
- 我们可以使用ExecutorService接口的Submit方法来运行Callable任务。
- ExecutorService还具有invokeAll()和invokeAny()方法,其中Callable作为参数传递。
- 我们还可以使用实用程序类Executors提供的Executors.callable(Runnable task)将Runnable对象转换为Callable对象。