java.lang.Runnable
是一个接口,它要由一个实例要由线程执行的类来实现。有两种方法可以启动一个新的线程 - 子类化线程和实现Runnable
。如果只通过重写Runnable
的run()
方法就可以完成任务,那么就没有必要对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
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。