浅谈 Fork/Join

fork/join的java7新增加的功能,可以把它理解成一个并发框架。我们通过fork/join能将一个可分解的大任务,分解成多个子任务同步执行,执行完毕后,在将各子任务的结果进行合并,得到最终的结果。

使用fork/join,首先要创建fork/join任务,可以通过继承RecursiveActionRecursiveTask来实现(ForkJoinTask是它们的父类)

  • RecursiveAction 不返回结果
  • RecursiveTask 返回结果

常用方法

  • compute(); 计算方法(分拆的子任务)
  • fork(); // 执行子任务
  • join(); // 子任务结束后返回对应结果

ForkJoinPool
除此之外,java还提供了个ForkJoinPool的工具类,它实现了工作窃取算法,使得空闲线程能够主动分担从别的线程分解出来的子任务,从而让所有的线程都尽可能处于饱满的工作状态,提高执行效率。

常用方法

  • execute(); //异步执行命令
  • invoke()和invokeAll(); // 异步执行命令,并返回对应结果
  • submit(); //异步执行命令,同时返回Future对象

使用方式如下

class Demo extends java.util.concurrent.RecursiveTask<Integer>{
    int start;
    int end;

    public Demo(int start,int end){
        this.start=start;
        this.end=end;
    }

    @Override
    protected Integer compute() {
        int sum=0;
        int s=start;
        int e=end;
        for(;s<=end;s++){
            sum+=s;
        }
        return sum;
    }
}

@Test
public void test2(){
    //1到1亿,相加等于几   0.37
    Demo demo1=new Demo(1,50000000);
    Demo demo2=new Demo(50000001,100000000);
    demo1.fork();
    demo2.fork();
    System.out.println(demo1.join()+demo2.join());
}

@Test
public void test3(){
    ForkJoinPool fjp=new ForkJoinPool();
    Demo demo1=new Demo(1,50000000);
    Demo demo2=new Demo(50000001,100000000);
    System.out.println(fjp.invoke(demo1)+fjp.invoke(demo2));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个节点

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

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

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

打赏作者

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

抵扣说明:

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

余额充值