Heim  >  Artikel  >  Java  >  Die Verwendung von ExecutorService und FutureTask in der Java-Parallelprogrammierung

Die Verwendung von ExecutorService und FutureTask in der Java-Parallelprogrammierung

WBOY
WBOYOriginal
2024-04-18 09:36:021130Durchsuche

Verwenden Sie ExecutorService, um den Thread-Pool zu verwalten und Aufgaben auszuführen, und verwenden Sie FutureTask, um Aufgaben asynchron auszuführen und ihre Ergebnisse abzurufen. ExecutorService stellt Methoden wie „execute()“ und „submit()“ bereit, und FutureTask stellt die Methoden „get()“, „isDone()“ und „cancel()“ bereit. Praxisbeispiele zeigen, wie man damit parallel Zahlen der Fibonacci-Folge berechnen kann.

Die Verwendung von ExecutorService und FutureTask in der Java-Parallelprogrammierung

Verwendung von ExecutorService und FutureTask in der parallelen Java-Programmierung

Einführung

ExecutorService und FutureTask sind nützliche Tools für die parallele Programmierung in Java. Mit ExecutorService können Sie eine Reihe von Threads verwalten, während Sie mit FutureTask Aufgaben asynchron ausführen und deren Ergebnisse abrufen können.

ExecutorService

ExecutorService ist eine Schnittstelle, die eine Sammlung ausführbarer Thread-Aufgaben darstellt. Sie können verschiedene Implementierungen von ExecutorService erstellen, indem Sie Folgendes verwenden:

ExecutorService executorService = Executors.newFixedThreadPool(5);

wobei 5 die Anzahl der Threads im Thread-Pool darstellt.

ExecutorService bietet die folgenden Methoden zum Ausführen von Aufgaben:

  • execute(Runnable task): Führt eine ausführbare Aufgabe aus. execute(Runnable task):执行一个 Runnable 任务。
  • submit(Runnable task):执行一个 Runnable 任务并返回值。
  • submit(Callable<t> task)</t>:执行一个 Callable 任务并返回值。

FutureTask

FutureTask 是一个 Callable 任务的包装器,它允许您异步执行任务并稍后检索其结果。您可以使用以下方法创建 FutureTask:

FutureTask<String> futureTask = new FutureTask<>(() -> "Hello, world!");

其中,() -> "Hello, world!" 是要执行的 Callable 任务。

FutureTask 提供以下方法来检索任务结果:

  • get():阻塞等待任务完成并返回结果。
  • isDone():检查任务是否已完成。
  • cancel(boolean mayInterruptIfRunning)
  • submit(Ausführbare Aufgabe): Eine ausführbare Aufgabe ausführen und einen Wert zurückgeben.

submit(Callable<t> task)</t>: Eine aufrufbare Aufgabe ausführen und einen Wert zurückgeben.

FutureTask

FutureTask ist ein Wrapper um eine aufrufbare Aufgabe, der es Ihnen ermöglicht, eine Aufgabe asynchron auszuführen und ihre Ergebnisse später abzurufen. Sie können eine FutureTask mit der folgenden Methode erstellen: 🎜
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

class FibonacciTask implements Callable<Long> {

    private int n;

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

    @Override
    public Long call() {
        long a = 0;
        long b = 1;
        for (int i = 0; i < n; i++) {
            long temp = a;
            a = b;
            b = temp + b;
        }
        return a;
    }
}

public class Main {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        FutureTask<Long>[] tasks = new FutureTask[10];

        // 创建并提交任务
        for (int i = 0; i < 10; i++) {
            tasks[i] = new FutureTask<>(new FibonacciTask(i));
            executorService.submit(tasks[i]);
        }

        // 获取并打印结果
        for (int i = 0; i < 10; i++) {
            try {
                System.out.println("斐波那契数列第 " + i + " 项:" + tasks[i].get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        // 关闭 ExecutorService
        executorService.shutdown();
    }
}
🎜wobei () -> „Hello, world!“ die auszuführende aufrufbare Aufgabe ist. 🎜🎜FutureTask bietet die folgenden Methoden zum Abrufen von Aufgabenergebnissen: 🎜🎜🎜get(): blockiert das Warten auf den Abschluss der Aufgabe und gibt das Ergebnis zurück. 🎜🎜isDone(): Überprüfen Sie, ob die Aufgabe abgeschlossen wurde. 🎜🎜cancel(boolean mayInterruptIfRunning): Brechen Sie die Aufgabe ab (falls möglich). 🎜🎜🎜🎜Praktischer Fall🎜🎜🎜Stellen Sie sich ein Programm vor, das die Fibonacci-Folge berechnet. Wir können ExecutorService und FutureTask verwenden, um mehrere Fibonacci-Zahlen parallel zu berechnen: 🎜rrreee🎜 In diesem Beispiel haben wir einen ExecutorService erstellt und 10 FibonacciTask-Aufgaben übermittelt. Jede Aufgabe berechnet eine Zahl in der Fibonacci-Folge. Mit FutureTask sind wir in der Lage, diese Aufgaben asynchron auszuführen und ihre Ergebnisse später zu erhalten. 🎜

Das obige ist der detaillierte Inhalt vonDie Verwendung von ExecutorService und FutureTask in der Java-Parallelprogrammierung. 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