java8之ForkJoin框架的使用

java8之ForkJoin框架的使用_第1张图片 标题

forkjoin框架最基本的介绍

package com.lyzx.concurrent.threadPool;

import java.util.concurrent.*;

/**
 * 分支合并线程池(mapReduce 类似的设计思想)。适合用于处理复杂任务。
 * 初始化线程容量与 CPU 核心数相关。
 * 线程池中运行的内容必须是 ForkJoinTask 的子类型(RecursiveTask,RecursiveAction)。
 * ForkJoinPool - 分支合并线程池。 可以递归完成复杂任务。 要求可分支合并的任务必须
 * 是 ForkJoinTask 类型的子类型。 其中提供了分支和合并的能力。 ForkJoinTask 类型提供了两个
 * 抽象子类型, RecursiveTask 有返回结果的分支合并任务,RecursiveAction 无返回结果的分支合并任务。(
 * Callable/Runnable) compute 方法:就是任务的执行逻辑。
 * ForkJoinPool 没有所谓的容量。默认都是 1 个线程。根据任务自动的分支新的子线程。
 * 当子线程任务结束后,自动合并。 所谓自动是根据 fork 和 join 两个方法实现的。
 * 应用: 主要是做科学计算或天文计算的。 数据分析的。
 */
public class ForkJoinPoolTest{
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        long[] arr = new long[20000];
        for(int i=0;i future = pool.submit(task);
        System.out.println(future.get());
    }
}

class JoinTask extends RecursiveTask{
    private int start,end;
    private long[] arr;
    private int target;

    public JoinTask(long[] arr,int start,int end,int target){
        this.arr = arr;
        this.start = start;
        this.end = end;
        this.target = target;
    }

    @Override
    protected Long compute() {
        /**
         * 如果分配的数组大小达到了指定的大小就执行相加的操作
         * 否则就继续拆分
         */
        if(end - start <= target){
            Long result = 0L;
            for(int i=start;i

 

你可能感兴趣的:(Java)