Java 中的 Runnable 與 Callable 介面

Mohammad Irfan 2023年10月12日
  1. Java 中的 Runnable 介面
  2. Java 中的 Runnable 介面示例
  3. Java 中的 Callable 介面
  4. Java 中的 Callable 介面示例
  5. Java 中的 Runnable VS Callable 介面
Java 中的 Runnable 與 Callable 介面

本教程通過 Java 中的示例介紹了 RunnableCallable 介面之間的區別。

Java 中的 Runnable 介面

Runnable 是用於在 Java 中建立和執行執行緒的介面。它只有一個抽象方法 run(),也稱為 Functional 介面。

你可以在下面看到 Runnable 介面的簽名及其 SAM 方法。

@FunctionalInterface public interface Runnable
void run() // Single Abstract Method

Java 中的 Runnable 介面示例

每個想要建立和執行執行緒的類都必須實現 Runnable 介面或擴充套件 Thread 類。

Runnable 介面提供了一個 run() 方法,該方法必須在基類中被覆蓋。該方法由 start() 方法隱式執行。請參見下面的示例。

public class SimpleTesting implements Runnable {
  public static void main(String[] args) {
    new Thread(new SimpleTesting()).start();
  }
  @Override
  public void run() {
    System.out.println("Running a thread");
  }
}

輸出:

Running a thread

Java 中的 Callable 介面

Callable 是一個介面,類似於 Runnable 介面。它還包含一個抽象方法,call()

這個介面是為那些例項可能被另一個執行緒執行的類設計的。Callable 介面和方法的簽名如下:

Executors 類包含從其他常見形式轉換為 Callable 類的實用方法。

@FunctionalInterface public interface Callable<V>
V call() throws Exception

Java 中的 Callable 介面示例

我們實現了 Callable 介面並覆蓋了它的 call() 方法。我們可以為 call() 方法獲取任何物件。

請參見下面的示例。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class SimpleTesting implements Callable<Integer> {
  public static void main(String[] args) throws InterruptedException, ExecutionException {
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    SimpleTesting st = new SimpleTesting();
    Future<Integer> future = executorService.submit(st);
    int result = future.get().intValue();
    System.out.println("product " + result);
  }

  @Override
  public Integer call() throws Exception {
    int product = 23 * 12;
    return product;
  }
}

輸出:

product 276

Java 中的 Runnable VS Callable 介面

下表包含一些理解 Java 的 RunnableCallable 介面的要點。

Runnable Callable
實現類必須相應地重寫它的 run() 方法。 實現類必須相應地覆蓋其 call() 方法。
run() 方法的返回型別是 void,因此不會向呼叫者返回任何內容。 call() 方法的返回型別是一個物件。它可以是字串、整數等。
run() 方法不會丟擲任何異常。 call() 方法可以在執行期間丟擲異常。
它可用於在 Java 中建立執行緒。 它不能用於建立執行緒。