Runnable是一個由類實現的接口,該類的實例旨在由線程執行。有兩種方法可以啟動新線程 - 子類化 Thread 並實現 Runnable。當任務可以僅通過覆蓋來完成時,不需要 sub-classing 線程跑步() Runnable 的方法。
Callable interface and Runnable interface are used to encapsulate tasks supposed to be executed by another thread.
However, Runnable instances can be run by Thread class as well as ExecutorService but Callable instances can only be executed via ExecutorService.
讓我們通過稍後單獨討論上述兩個接口的定義來討論它們之間的差異,然後以表格格式得出主要差異。
可調用接口
在一個可調用接口中,本質上拋出一個已檢查的異常並返回一些結果。這是即將推出的 Runnable 接口之間的主要區別之一,其中不返回任何值。在這個接口中,它隻是計算結果,如果無法計算結果,則會拋出異常。
public interface Callable<V> { V call() throws exception ; }
- 它在‘java.util.concurrent'包。
- 該接口還包含一個單一的、無參數的方法,稱為call()方法
- 我們不能通過傳遞 callable 作為參數來創建線程。
- Callable 可以返回結果。 Callable 的 call() 方法包含 “throws Exception” 子句,因此我們可以輕鬆地進一步傳播已檢查的異常。
例子:
Java
// 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
可運行的接口
當使用實現此接口的對象創建線程時,啟動線程會導致在單獨執行的線程中調用對象的 run 方法。一般。這個run()方法的合同是它可以采取任何行動。
public interface Runnable { public abstract void run(); }
- java.lang.Runnable是一個接口,僅定義一個方法,稱為run()。
- 它代表Java中由線程執行的任務。
- 使用 Runnable 啟動新線程有兩種方法,一種是實現 Runnable 接口,另一種是子類化 Thread 類。
- Runnable 無法返回計算結果,如果您在另一個線程中執行某些計算任務,這一點至關重要,並且 Runnable 無法拋出已檢查的異常。
示例
Java
// 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 1.0 以來,它是 java.lang 包的一部分 | 它是java.util.concurrent 從 Java 1.5 開始打包。 |
它無法返回計算結果。 | 它可以返回任務並行處理的結果。 |
它不能拋出已檢查的異常。 | 它可以拋出一個已檢查的異常。 |
在可運行接口中,需要重寫Java中的run()方法。 | 為了使用Callable,您需要覆蓋call() |
相關用法
- Java Calendar Clone()用法及代碼示例
- Java Calendar ComputeFields()用法及代碼示例
- Java Calendar after()用法及代碼示例
- Java Calendar equals()用法及代碼示例
- Java Calendar getAvailableCalendarTypes()用法及代碼示例
- Java Calendar getCalendarType()用法及代碼示例
- Java Calendar getWeekYear()用法及代碼示例
- Java Calendar getWeeksInWeekYear()用法及代碼示例
- Java Calendar isWeekDateSupported()用法及代碼示例
- Java Calendar setMinimalDaysInFirstWeek()用法及代碼示例
- Java Calendar setTimZone()用法及代碼示例
- Java Calendar setWeekDate()用法及代碼示例
- Java Calendar toInstant()用法及代碼示例
- Java Calendar before()用法及代碼示例
- Java Calendar add()用法及代碼示例
- Java Calendar.before()用法及代碼示例
- Java Calendar clear()用法及代碼示例
- Java Calendar clone()用法及代碼示例
- Java Calendar compareTo()用法及代碼示例
- Java Calendar complete()用法及代碼示例
- Java Calendar computeFields()用法及代碼示例
- Java Calendar computeTime()用法及代碼示例
- Java Calendar.equals()用法及代碼示例
- Java Calendar get()用法及代碼示例
- Java Calendar.get()用法及代碼示例
注:本文由純淨天空篩選整理自taresh2112大神的英文原創作品 Difference Between Callable and Runnable in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。