java.lang.Runnable是一个接口,它要由一个实例要由线程执行的类来实现。有两种方法可以启动一个新的线程 - 子类化线程和实现Runnable。如果只通过重写Runnablerun()方法就可以完成任务,那么就没有必要对Thread进行子类化。

Callable接口和Runnable接口是用来封装需要由另一个线程来执行的任务的。然而,Runnable实例可以由Thread类和ExecutorService运行,但Callable实例只能通过ExecutorService执行。

让我们讨论一下上述两个接口的区别,在以后的讨论中,将以表格的形式来总结这两个接口的主要区别。

Callable接口

在一个 Callable 接口中,基本上抛出一个检查的异常并返回一些结果。这是即将推出的 Runnable 接口之间的主要区别之一,其中不返回任何值。在此接口中,它只是计算结果,否则如果无法这样做,则会引发异常。

public interface Callable<V> 
{
  V call() throws exception ;
}
  • 它在“java.util.concurrent”包中声明。
  • 此接口还包含一个单独的无参数方法,称为 call() 方法
  • 不能通过将 Callable 作为参数传递来创建线程。
  • Callable可以返回结果。Callable 的 call() 方法包含 “throws Exception” 子句,因此可以轻松地进一步传播检查异常。

示例代码:

// Java Program to illustrate Callable interface

// Importing classes from java.util package
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// Class
// Implementing the Callable interface
class CallableMessage implements Callable<String>{
public String call() throws Exception{
    return "Hello World!";
}
}

public class CallableExample{
static ExecutorService executor = Executors.newFixedThreadPool(2);
    public static void main(String[] args) throws Exception{
        CallableMessage task = new CallableMessage();
        Future<String> message = executor.submit(task);
        System.out.println(message.get().toString());
    }
}

运行结果:

Hello World

Runnable的接口

当实现此接口的对象用于创建线程时,启动线程会导致在单独执行的线程中调用对象运行方法。将军。这个 run() 方法的约定是它可以采取任何操作。

public interface Runnable 
{
  public abstract void run();
}
  • java.lang.Runnable 是一个接口,只定义了一个名为 run() 的方法。
  • 它表示由 Thread 执行的 Java 任务。
  • 使用 Runnable 启动新线程有两种方法,一种是实现 Runnable 接口,另一种是子类化 Thread 类。
  • Runnable 无法返回计算结果,如果您在另一个线程中执行某些计算任务,则 Runnable 无法返回计算结果,并且 Runnable 无法抛出已检查的异常。

示例代码:

// Java Program to implement Runnable interface

// Importing FileNotFound class from
// input output classes bundle
import java.io.FileNotFoundException;
import java.util.concurrent.*;

// Class
// Implementing the Runnable interface
class RunnableImpl implements Runnable {

public void run()
{
    System.out.println("Hello World from a different thread than Main");
}
}
public class RunnableExample{
    static ExecutorService executor = Executors.newFixedThreadPool(2);
public static void main(String[] args){
        // Creating and running runnable task using Thread class
        RunnableImpl task = new RunnableImpl();
        Thread thread = new Thread(task);
        thread.start();
        // Creating and running runnable task using Executor Service.
        executor.submit(task);
    }
}
`

Java中Runnable和Callable的区别

Runnable接口 Callable接口
从Java 1.0开始,它是java.lang包的一部分 从Java 1.5开始,它是java.util.concurrent包的一部分。
Runnable接口不能返回计算的结果。 Callable接口可以返回一个任务的并行处理的结果。
Runnable接口不能抛出一个有检查的异常。 Callable接口可以抛出一个有检查的异常。
在一个可运行接口中,人们需要覆盖Java中的run()方法。 为了使用Callable,需要覆盖 call()

Java中Runnable和Callable的区别

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Java中Runnable和Callable的区别
本文链接:https://www.vsdiffer.com/vs/difference-between-callable-and-runnable-in-java.html
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。