博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java多线程的Fork/Join
阅读量:6824 次
发布时间:2019-06-26

本文共 2011 字,大约阅读时间需要 6 分钟。

  hot3.png

JDK1.7提供了Fork/Join方式的大任务分解成小任务执行的API。

下面是一个简单实例:

计算1到1000的累加和,要求两两相加,再把各自的结果再次两两相加直到得出最后一个结果。也就是把累加的任务分成许多个两个数相加的小任务,然后再合并这些任务的计算结果。

package thread.test3;import java.util.concurrent.RecursiveTask;public class CountTask extends RecursiveTask
{    private static final long serialVersionUID = 1L;        private int start,end;        private int taskSize = 2;        public CountTask(int start,int end)    {        this.start = start;        this.end = end;    }    /**     * 每个任务执行的工作     */    @Override    protected Integer compute() {                int sum = 0;        boolean canCompute = (end - start) <= taskSize;                if(canCompute)//判断当前任务是否可以继续划分,如果不能继续划分,则开始运算        {            for(int i = start;i<= end;i++)            {                sum  = sum + i;            }        }        else {            /**             * 划分为两个任务             */            int middle = (start + end) / 2;            CountTask task1 = new CountTask(start, middle);            CountTask task2 = new CountTask(middle + 1, end);                        task1.fork();//开始执行            task2.fork();//开始执行                        //获得一个子任务的结果,如果得不到结果,此线程就不会往下继续执行            int task1Result = task1.join();            int task2Result = task2.join();                        sum = task1Result + task2Result;//合并子任务的结果        }        return sum;    }    }

主函数:

package thread.test3;import java.util.concurrent.ExecutionException;import java.util.concurrent.ForkJoinPool;import java.util.concurrent.Future;public class Test {        public static void main(String[] args) throws Exception, ExecutionException {                ForkJoinPool forkJoinPool = new ForkJoinPool();//线程池                CountTask task = new CountTask(1, 1000);                Future
 result = forkJoinPool.submit(task);                System.out.println("1 - 1000的累加结果是:"+result.get());        System.out.println("主线程结束...");            }}

运行结果:

1 - 1000的累加结果是:5050

主线程结束...

转载于:https://my.oschina.net/ChiLin/blog/666705

你可能感兴趣的文章
轻松解决ubuntu系统引导问题
查看>>
用Vue来实现音乐播放器(十四):歌手数据接口抓取
查看>>
laya在微信小游戏中加载BitmapFont失效的问题
查看>>
二阶段冲刺04
查看>>
Domain Logic approaches
查看>>
curl命令测试服务器是否支持断点续传
查看>>
LinkedList源码解析
查看>>
跟我学算法-吴恩达老师(超参数调试, batch归一化, softmax使用,tensorflow框架举例)...
查看>>
airflow 某个DAG不在web界面显示
查看>>
neo4j高可用环境搭建
查看>>
解析json的方法
查看>>
orm查询存在价格为空问题
查看>>
iptables
查看>>
input type file onchange上传文件的过程中,同一个文件二次上传无效的问题。
查看>>
CSS3 圆角(border-radius)
查看>>
win7下安装tomcat
查看>>
java基础之short转换byte[]
查看>>
第一次阅读作业
查看>>
Java.lang.Comparable接口和Java.util.Comparator接口的区别
查看>>
使用Python的turtle模块画出简单的柱状图
查看>>