ForkJoinTask简单使用demo
2017-06-27 17:38
357 查看
ForkJoinTask 实现抽象类:RecursiveTask 有返回值的task, RecursiveAction 无返回值的task
RecursiveAction demo:
Java Code
RecursiveTask demo如下:
Java Code
RecursiveAction demo:
Java Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package com.example.thread; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveAction; import java.util.concurrent.TimeUnit; /** * *RecursiveAction代表没有返回值的任务。 */ class PrintTask extends RecursiveAction { private static final long serialVersionUID = -4335005084191316849L; // 每个"小任务"最多只打印20个数 private static final int MAX = 20; private int start; private int end; PrintTask(int start, int end) { this.start = start; this.end = end; } @Override protected void compute() { // 当end-start的值小于MAX时候,开始打印 if ((end - start) < MAX) { for (int i = start; i < end; i++) { System.out.println(Thread.currentThread().getName() + "的i值:" + i); } } else { // 将大任务分解成两个小任务 int middle = (start + end) / 2; PrintTask left = new PrintTask(start, middle); PrintTask right = new PrintTask(middle, end); // 并行执行两个小任务 left.fork(); right.fork(); } } } public class ForkJoinPoolTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { // 创建包含Runtime.getRuntime().availableProcessors()返回值作为个数的并行线程的ForkJoinPool ForkJoinPool forkJoinPool = new ForkJoinPool(); // 提交可分解的PrintTask任务 forkJoinPool.submit(new PrintTask(0, 1000)); forkJoinPool.awaitTermination(2, TimeUnit.SECONDS);//阻塞当前线程直到 ForkJoinPool 中所有的任务都执行结束 // 关闭线程池 forkJoinPool.shutdown(); } } |
Java Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | package com.example.thread; import java.util.Random; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; /** * * RecursiveTask有返回值类型 */ class SumTask extends RecursiveTask<Integer> { private static final long serialVersionUID = -7132529934386580711L; // 每个"小任务"最多只打印70个数 private static final int MAX = 70; private int arr[]; private int start; private int end; SumTask(int arr[], int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected Integer compute() { int sum = 0; // 当end-start的值小于MAX时候,开始打印 if ((end - start) < MAX) { for (int i = start; i < end; i++) { sum += arr[i]; } return sum; } else { System.err.println("=====任务分解======"); // 将大任务分解成两个小任务 int middle = (start + end) / 2; SumTask left = new SumTask(arr, start, middle); SumTask right = new SumTask(arr, middle, end); // 并行执行两个小任务 left.fork(); right.fork(); // 把两个小任务累加的结果合并起来 return left.join() + right.join(); } } } public class ForkJoinPoolTest2 { public static void main(String[] args) throws Exception { int arr[] = new int[1000]; Random random = new Random(); int total = 0; // 初始化100个数字元素 for (int i = 0; i < arr.length; i++) { int temp = random.nextInt(100); // 对数组元素赋值,并将数组元素的值添加到total总和中 total += (arr[i] = temp); } System.out.println("初始化时的总和=" + total); // 创建包含Runtime.getRuntime().availableProcessors()返回值作为个数的并行线程的ForkJoinPool ForkJoinPool forkJoinPool = new ForkJoinPool(); // 提交可分解的PrintTask任务 Future<Integer> future = forkJoinPool.submit(new SumTask(arr, 0, arr.length)); System.out.println("计算出来的总和=" + future.get()); // 关闭线程池 forkJoinPool.shutdown(); } } |
相关文章推荐
- JAVA并行计算之ForkJoinTask使用样例
- 使用Java开源工作流jBPM开发一个简单的Demo
- FileDialog简单使用demo
- 使用游标循环表的简单DEMO
- KindEditor简单的Demo使用
- java 使用简单的demo实例告诉你优化算法的强大
- ajax---简单使用Demo
- xpo 使用简单demo
- Sprite Kit的简单使用Demo
- Sencha Architect使用treepanel的简单demo
- [Android-Demo] Android 数据库(SQL)简单使用Demo
- APIDemo学习笔记——Android上几种简单的Animation使用方法(二)
- Jmesa简单的使用demo
- Android 数据库SQLite的使用简单Demo
- 使用JQuery实现简单的半透明遮盖层 + 弹出框居中 Demo
- FileDialog简单使用demo
- AngryBird简单开发实现(一),使用JBox2D-2.1.2简单开发的demo
- WebRTC VoiceEngine使用简单Demo
- AIDL简单使用Demo
- WebRTC VoiceEngine使用简单Demo