Maison  >  Article  >  Java  >  Quelle est la différence entre FutureTask et Callable dans la simultanéité des fonctions Java et le multithreading ?

Quelle est la différence entre FutureTask et Callable dans la simultanéité des fonctions Java et le multithreading ?

WBOY
WBOYoriginal
2024-04-27 10:45:01462parcourir

Quelle est la différence entre FutureTask et Callable dans la simultanéité des fonctions Java et le multithreading ?

FutureTask et Callable : La différence dans la concurrence Java

Dans la programmation simultanée Java, FutureTask et Callable jouent un rôle important, et la différence entre eux la différence est : 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🎜🎜
  • Représente une tâche qui peut être exécutée simultanément.
  • Similaire à Runnable, mais avec une valeur de retour.
  • Une méthode call() est définie pour renvoyer le résultat de la tâche.
🎜🎜FutureTask🎜🎜
  • Implémente l'interface Future pour représenter les tâches asynchrones en cours d'exécution ou terminées.
  • Enveloppez un objet Callable pour gérer les détails de l'exécution de la tâche.
  • Fournissez des méthodes pour obtenir les résultats de la tâche (get()) et vérifiez si la tâche est terminée (isDone()).
🎜🎜Différence🎜🎜 La gestion des exceptions
Fonctionnalités Appelable FutureTask
Valeur de retour Aucune valeur de retour Renvoyer les résultats de la tâche
Beaucoup Prise en charge des résultats Non pris en charge Prise en charge de plusieurs FutureTask représentant le même Callable
Annulation des tâches Non pris en charge Prend en charge l'annulation des tâches en appelant cancel()
call() est gérée dans la méthode FutureTask et le get() est fournie pour Gestion des exceptions
🎜🎜Cas pratique🎜🎜🎜Supposons que nous ayons une tâche simple pour calculer les n premiers éléments de la séquence de Fibonacci. 🎜🎜🎜Implémentation Callable : 🎜🎜rrreee🎜🎜Implémentation FutureTask : 🎜🎜rrreee🎜Dans cet exemple, nous utilisons Callable pour définir la tâche et FutureTask pour gérer l'exécution de la tâche. . En appelant la méthode get(), nous pouvons obtenir la séquence de Fibonacci une fois la tâche terminée. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn