java多线程的Fork/Join
2016-04-26 00:00
323 查看
JDK1.7提供了Fork/Join方式的大任务分解成小任务执行的API。
下面是一个简单实例:
计算1到1000的累加和,要求两两相加,再把各自的结果再次两两相加直到得出最后一个结果。也就是把累加的任务分成许多个两个数相加的小任务,然后再合并这些任务的计算结果。
主函数:
运行结果:
1 - 1000的累加结果是:5050
主线程结束...
下面是一个简单实例:
计算1到1000的累加和,要求两两相加,再把各自的结果再次两两相加直到得出最后一个结果。也就是把累加的任务分成许多个两个数相加的小任务,然后再合并这些任务的计算结果。
package thread.test3; import java.util.concurrent.RecursiveTask; public class CountTask extends RecursiveTask<Integer> { 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<Integer> result = forkJoinPool.submit(task); System.out.println("1 - 1000的累加结果是:"+result.get()); System.out.println("主线程结束..."); } }
运行结果:
1 - 1000的累加结果是:5050
主线程结束...
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树