线程讲解(十四)

Fork/Join 框架中的任务

ForkJoinTask 类是所有在 Fork/Join 框架中执行的任务的基类,它提供了一系列机制来实现 Fork 和 Join 操作。该类有两个子类,分别是 RecursiveAction 和 RecursiveTask。

  1. 从 RecursiveAction 类继承的子类方法一般没有返回值。
  2. 从 RecursiveTask 类继承的子类方法则有返回值。

任务的创建

在创建任务时,最好不要从 ForkJoinTask 类直接继承,而是从该类的子类 RecursiveAction 或 RecursiveTask 继承。
1、从 RecursiveAction 类继承创建任务
继承后的新类需要重写该类的 compute() 方法。
常用的方法:

  1. isDone() :用于判断任务是否完成。
  2. cancel(boolean manyInterruptIfRunning):用于取消一个任务的执行。

2、从 RecursiveTask 类继承创建任务
从 RecursiveTask 类继承时通常要指明一个特定的数据类型,例如:

public class ExecTask extends RecursiveTask<Integer> {}

ExecTask 类继承自 RecursiveTask ,并对整型数据进行操作。
从 RecursiveTask 类继承的子类需要重写 protected compute() 方法,该方法有返回值,通过泛型 T 指明返回值的类型。
获取返回值有两种方法:

  1. join():该方法与 Thread.join() 方法不同,用于获取执行结果。
  2. get():当任务结束后返回任务的计算结果。

任务的运行方式

Fork/Join 框架提供了一种更为有效的任务管理方法,当 ForkJoinPool 执行 ForkJoinTask 任务时可以采用同步或者异步的运行方式。
当采用同步运行方式时,把任务交给 ForkJoinPool 处理后不会立即返回,而是等待任务全部结束才能够返回继续执行;采用异步的运行方式时,把任务发送到 ForkJoinPool 后会马上返回并继续执行。
采用不同的运行方式时,任务调用的方法是不同的。
前面说的 invokeAll() 方法会使任务被挂起等待,直到被提交到 ForkJoinPool 的任务处理完毕后才继续执行;可见 invokeAll() 方法使任务运行在同步方式中。
如果要运行在异步方式中,可以采用 fork() 方法,处于该方式中的 ForkJoinPool 不会使用工作窃取算法来提高程序的性能;在这种情况下,需要调用 join() 和 get() 方法来等待任务的结束,这个时候 ForkJoinPool 才会使用工作窃取算法。

任务的取消

在一个任务开始运行之前,可以取消该任务的执行。类 ForkJoinTask 提供了 cancel() 方式实现任务的取消,但该方法只能取消那些还没有开始运行的任务,ForkJoinPool 类没有提供取消那些正在运行或者正在等待运行任务的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腹黑的乌鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值