java多线程之 Fork/Join框架

如果我们需要处理一大批数据,但是没有处理这批数据的能力,就可以使用分而治之的方式.fork/join框架就是对这种方式的体现.

ForkJoinTask 接口的实现类:   RecursiveTask  有返回值     RecursiveAction  无返回值

demo:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

public class TestForkJoin{

    /**
     * ForkJoinTask 接口下的继承类   RecursiveTask   有返回值
     * RecursiveAction  无返回值
     *
     * 计算求和
     */
   private static class TaskDemo extends RecursiveTask<Long> {   //继承RecursiveTask
       private static final int NUM = 10;  //数据个数大于10 则使用分而治之  方式
       private int start;
       private int end;
       public TaskDemo(int start, int end){
           this.start = start;
           this.end = end;
       }
       @Override
       protected Long compute() {
           Long sum = 0L;
           if((end - start + 1) < NUM){
               for(int i = start; i <= end; i++){
                   sum += i;
               }
           }else{
               int step = (end - start)/10;   //  10 子线程数    step  每个子线程处理的数据量
               List<TaskDemo> list = new ArrayList<TaskDemo>();
               int pos = start;
               for(int i = 0; i < 10; i++){
                   int lastOne = pos + step;
                   if(lastOne > end){
                       lastOne = end;
                   }
                   TaskDemo taskDemo = new TaskDemo(pos, lastOne);
                   pos += step + 1;
                   list.add(taskDemo);
                   taskDemo.fork();   //生成子线程执行任务
               }
               for(TaskDemo task : list){
                   sum += task.join();  //获取子线程返回的结果
               }
           }
           return sum;
       }
   }


    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();   //forkJoinPool   连接池
        TaskDemo taskDemo = new TaskDemo(1, 12);
        ForkJoinTask<Long> task = forkJoinPool.submit(taskDemo);
        Long result = null;   //会阻塞  直到子线程都执行完
        try {
            result = task.get();
            System.out.println(result);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        forkJoinPool.shutdown();
    }
}

结果显示:

  78

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值