其他分享
首页 > 其他分享> > ForkJoin

ForkJoin

作者:互联网

Fork/Join框架强调任务的分解。
该框架主要有Fork,join两个操作组成,Fork操作主要用于对任务和数据进行划分。join操作用于对各个部分的运行结果进行合并
该框架有一个重要的方法,叫做工作窃取法,当一个线程完成任务时,会去查看其它线程是否完成了任务,如果没有,就将窃取一部分任务来处理,提高效率和资源利用率

继承RecursiveTask类,重写compute方法。来创建线程任务

package com.luoKing.ForkJoin;


import java.util.concurrent.RecursiveTask;

public class ForkJTask extends RecursiveTask<Long>{
    //计算1-10_0000_0000的和
    //具体任务
    private Long start;
    private Long end;
    private int temp = 5_0000;//门槛值



    public ForkJTask(Long start, Long end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if((end-start)<temp){
            Long sum = 0L;//总结果
            for (Long i = start; i <= end; i++) {
                sum +=i;
            }
            return sum;
        }else{
            Long middle = (start+end)/2;//中间值
            ForkJTask task1 = new ForkJTask(start, middle);//任务1
            task1.fork();//拆分任务,将线程压入队列
            ForkJTask task2 = new ForkJTask(middle + 1, end);
            task2.fork();
            return task1.join()+task2.join();//合并结果
        }
    }
}

使用ForkJoinPool类来启动线程任务

package com.luoKing.ForkJoin;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;

public class test {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJTask forkJTask = new ForkJTask(0L,10_0000_0000L);
        ForkJoinTask<Long> submit = forkJoinPool.submit(forkJTask);
        System.out.println(submit.get());

    }
}

Fork/Join框架的编程模式决定了它更适合具有递归操作的程序,通常需要程序员手动设置阈值。可操作性强

标签:end,ForkJoinPool,Long,util,start,import,ForkJoin
来源: https://www.cnblogs.com/luoking/p/16243695.html