当前位置: 首页 > 图灵资讯 > 技术篇> Java并行编程中的ExecutorService和FutureTask的使用

Java并行编程中的ExecutorService和FutureTask的使用

来源:图灵教育
时间:2024-04-19 13:41:19

利用 executorservice 使用管理线程池并执行任务 futuretask 异步执行任务并检索其结果。executorservice 提供了 execute()、submit() 等方法,futuretask 提供了 get()、isdone()、cancel() 方法。如何并行计算斐波那契数列中的数字,通过实战案例展示。

Java并行编程中的ExecutorService和FutureTask的使用

Java 并行编程 ExecutorService 和 FutureTask 的使用

简介

ExecutorService 和 FutureTask 是 Java 并行编程的有用工具。ExecutorService 允许您管理一组线程,但是 FutureTask 允许您异步执行任务并检索结果。

ExecutorService

ExecutorService 它是一个接口,表示可执行线程任务的集合。您可以使用以下方法来创建它 ExecutorService 不同的实现:

ExecutorService executorService = Executors.newFixedThreadPool(5);

登录后复制

其中,5 表示线程池中的线程数。

ExecutorService 执行任务的方法如下:

  • execute(Runnable task):执行一个 Runnable 任务。
  • submit(Runnable task):执行一个 Runnable 并返回任务值。
  • submit(Callable<T> task):执行一个 Callable 并返回任务值。

FutureTask

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

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

登录后复制

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

FutureTask 检索任务结果的方法如下:

  • get():阻塞等待任务完成并返回结果。
  • isDone():检查任务是否已完成。
  • cancel(boolean mayInterruptIfRunning):取消任务(如有可能)。

实战案例

考虑计算斐波那契数列的程序。我们可以使用它 ExecutorService 和 FutureTask 多个斐波那契数并行计算:

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();
    }
}

登录后复制

在这个例子中,我们创建了一个 ExecutorService 并提交了 10 个 FibonacciTask 任务。每个任务计算斐波那契数列中的一个数字。使用 FutureTask,我们可以异步执行这些任务,以后再得到结果。

以上是Java并行编程中使用Executorservice和Futuretask的详细内容。请关注图灵教育的其他相关文章!