Heim  >  Artikel  >  Java  >  Was ist der Unterschied zwischen FutureTask und Callable in der Parallelität und Multithreading von Java-Funktionen?

Was ist der Unterschied zwischen FutureTask und Callable in der Parallelität und Multithreading von Java-Funktionen?

WBOY
WBOYOriginal
2024-04-27 10:45:01465Durchsuche

Was ist der Unterschied zwischen FutureTask und Callable in der Parallelität und Multithreading von Java-Funktionen?

FutureTask und Callable: Der Unterschied in der Java-Parallelität

In der Java-Parallelitätsprogrammierung spielen FutureTask und Callable eine wichtige Rolle, und der Unterschied zwischen ihnen Der Unterschied ist: FutureTaskCallable 扮演着重要的角色,它们之间的区别在于:

Callable

  • 表示一个可以被并发执行的任务。
  • 类似于 Runnable,但具有返回值。
  • 定义了一个 call() 方法,返回任务的结果。

FutureTask

  • 实现 Future 接口,表示正在执行或已完成的异步任务。
  • 包装一个 Callable 对象,用于管理任务执行的细节。
  • 提供方法来获取任务结果(get())并检查任务是否完成(isDone())。

区别

特征 Callable FutureTask
返回值 无返回值 返回任务结果
多结果支持 不支持 支持多个 FutureTask 代表同一 Callable
取消任务 不支持 支持通过调用 cancel() 取消任务
异常处理 call() 方法中处理 FutureTask 提供 get() 方法来处理异常

实战案例

假设我们有一个简单任务,计算斐波那契数列的第一个 n 个元素。

Callable 实现:

import java.util.concurrent.Callable;

public class FibonacciCallable implements Callable<Integer[]> {

    private int n;

    public FibonacciCallable(int n) {
        this.n = n;
    }

    @Override
    public Integer[] call() {
        Integer[] fibSequence = new Integer[n];
        fibSequence[0] = 0;
        fibSequence[1] = 1;
        for (int i = 2; i < n; i++) {
            fibSequence[i] = fibSequence[i - 1] + fibSequence[i - 2];
        }
        return fibSequence;
    }
}

FutureTask 实现:

import java.util.concurrent.FutureTask;
import java.util.concurrent.ExecutionException;

public class FibonacciFutureTask {

    public static void main(String[] args) {
        int n = 10;
        FibonacciCallable callable = new FibonacciCallable(n);
        FutureTask<Integer[]> futureTask = new FutureTask<>(callable);
        new Thread(futureTask).start();

        Integer[] fibSequence;
        try {
            fibSequence = futureTask.get();  // 等待任务完成并获取结果
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        System.out.println("Fibonacci sequence upto " + n + " elements:");
        for (Integer fib : fibSequence) {
            System.out.print(fib + " ");
        }
    }
}

在此示例中,我们使用 Callable 来定义任务,使用 FutureTask 来管理任务执行。通过调用 get()

🎜Callable🎜🎜
  • Stellt eine Aufgabe dar, die gleichzeitig ausgeführt werden kann.
  • Ähnlich wie Runnable, aber mit einem Rückgabewert.
  • Eine call()-Methode ist definiert, um das Ergebnis der Aufgabe zurückzugeben.
🎜🎜FutureTask🎜🎜
  • Implementiert die Future-Schnittstelle, um asynchrone Aufgaben darzustellen, die ausgeführt oder abgeschlossen werden.
  • Umschließen Sie ein Callable-Objekt, um die Details der Aufgabenausführung zu verwalten.
  • Stellen Sie Methoden bereit, um die Aufgabenergebnisse abzurufen (get()) und zu überprüfen, ob die Aufgabe abgeschlossen ist (isDone()).
🎜🎜Difference🎜🎜 darstellen Die Ausnahmebehandlung
Features Callable FutureTask
Rückgabewert Kein Rückgabewert Aufgabenergebnisse zurückgeben
Viele Ergebnisunterstützung Nicht unterstützt Unterstützt mehrere FutureTask, die dasselbe Callable
Abbruch von Aufgaben Nicht unterstützt Unterstützt den Abbruch von Aufgaben durch Aufruf von cancel()
call() wird in der Methode FutureTask und dem get()-Methode wird zur Behandlung von Ausnahmen bereitgestellt
🎜🎜Praktischer Fall🎜🎜🎜Angenommen, wir haben eine einfache Aufgabe, die ersten n Elemente der Fibonacci-Folge zu berechnen. 🎜🎜🎜Callable-Implementierung: 🎜🎜rrreee🎜🎜FutureTask-Implementierung: 🎜🎜rrreee🎜In diesem Beispiel verwenden wir Callable, um die Aufgabe zu definieren, und FutureTask, um die Aufgabenausführung zu verwalten . Durch Aufrufen der Methode get() können wir die Fibonacci-Folge abrufen, nachdem die Aufgabe abgeschlossen ist. 🎜

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen FutureTask und Callable in der Parallelität und Multithreading von Java-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn