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对象。