heima并发21---并发工具(6)---fork/join---232-234

fork-join框架:https://blog.csdn.net/tyrroo/article/details/81390202

fork-join主要是cpu密集型的,cpu核心数和线程数是一样的。

返回值指的是方法的返回值。

---232---

代码:

package cn.itcast.n8;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
@Slf4j(topic = "c.TestForkJoin2")
public class TestForkJoin2 {
    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool(4);// 4个线程的线程池
        System.out.println(pool.invoke(new MyTask(5)));
        // new MyTask(5)  5+ new MyTask(4)  4 + new MyTask(3)  3 + new MyTask(2)  2 + new MyTask(1)
    }
}
// 1~n 之间整数的和 recursive的本意是递归的意思
@Slf4j(topic = "c.MyTask")
class MyTask extends RecursiveTask<Integer> {
    private int n;
    public MyTask(int n) {
        this.n = n;
    }
    @Override
    public String toString() {
        return "{" + n + '}';
    }
    @Override
    protected Integer compute() {
        // 如果 n 已经为 1,可以求得结果了。
        if (n == 1) {
            System.out.println("join() {}"+n);
            return n;
        }
        // 将任务进行拆分(fork)
//        AddTask1 t1 = new AddTask1(n - 1);
        MyTask t1 = new MyTask(n - 1);
        t1.fork();
        System.out.println("fork() {} + {}"+n+" "+t1);
        // 合并(join)结果
        int result = n + t1.join();
        System.out.println("join() {} + {} = {}"+n+" "+t1+" "+result);
        return result;
    }
}


其中{4}代表任务4。

前面的worker是线程的。

新线程执行。

花括号是任务 实现是任务的拆分 虚线是返回的结果 t是线程

这个会一个任务依赖于另外的一个任务这样并行度是不够的。

---233---

拆分的手段进行改进。

之前就是任务5等待任务4的结果,任务4等待任务3的结果。一个任务依赖于另外一个任务。

就是比如5求和,就是拆分为1到3求和,和4到5求和。

---234---

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值