Rumah  >  Artikel  >  Java  >  Apakah perbezaan antara FutureTask dan Callable dalam fungsi Java concurrency dan multi-threading?

Apakah perbezaan antara FutureTask dan Callable dalam fungsi Java concurrency dan multi-threading?

WBOY
WBOYasal
2024-04-27 10:45:01462semak imbas

Apakah perbezaan antara FutureTask dan Callable dalam fungsi Java concurrency dan multi-threading?

FutureTask and Callable: Perbezaan dalam Java concurrency

Dalam pengaturcaraan serentak Java, FutureTask dan Cllable memainkan peranan penting, dan perbezaan antara mereka perbezaannya ialah: 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()

🎜Boleh Dipanggil🎜🎜
  • Mewakili tugas yang boleh dilaksanakan serentak.
  • Serupa dengan Dapat dijalankan, tetapi dengan nilai pulangan.
  • Kaedah call() ditakrifkan untuk mengembalikan hasil tugasan.
🎜🎜FutureTask🎜🎜
  • Melaksanakan antara muka Masa Depan untuk mewakili tugas tak segerak yang sedang dilaksanakan atau diselesaikan.
  • Balut objek Boleh Panggil untuk mengurus butiran pelaksanaan tugas.
  • Sediakan kaedah untuk mendapatkan hasil tugasan (get()) dan semak sama ada tugasan selesai (isDone()).
🎜🎜Perbezaan🎜🎜 yang sama Pengendalian pengecualian
Ciri Boleh Dipanggil FutureTask
Nilai pulangan Tiada nilai pulangan Kembalikan hasil tugasan
Banyak Sokongan keputusan Tidak disokong Sokong berbilang FutureTask yang mewakili Boleh Dipanggil
Pembatalan tugas Tidak disokong Menyokong pembatalan tugas dengan memanggil batal()
panggilan() dikendalikan dalam kaedah FutureTask dan get() disediakan untuk Mengendalikan pengecualian
🎜🎜Kes praktikal🎜🎜🎜 Katakan kita mempunyai tugas mudah untuk mengira n unsur pertama jujukan Fibonacci. 🎜🎜🎜Pelaksanaan boleh panggil: 🎜🎜rrreee🎜🎜PelaksanaanFutureTask: 🎜🎜rrreee🎜Dalam contoh ini, kami menggunakan Cllable untuk mentakrifkan tugas dan FutureTask untuk mengurus tugasan . Dengan memanggil kaedah get(), kita boleh mendapatkan jujukan Fibonacci selepas tugasan selesai. 🎜

Atas ialah kandungan terperinci Apakah perbezaan antara FutureTask dan Callable dalam fungsi Java concurrency dan multi-threading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn