HOWTO · Java

Java 中的 Runnable 與 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 中建立執行緒。 它不能用於建立執行緒。