首页 > Java > java教程 > Java并行编程中的ExecutorService和FutureTask的使用

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

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2024-04-18 09:36:02
原创
1275 人浏览过

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

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

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

简介

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

ExecutorService

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

1

ExecutorService executorService = Executors.newFixedThreadPool(5);

登录后复制

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

ExecutorService 提供以下方法来执行任务:

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

FutureTask

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

1

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

登录后复制

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

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

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

实战案例

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

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的使用的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板