ForkJoinTask 实现抽象类:RecursiveTask 有返回值的task, RecursiveAction 无返回值的task
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(); } } |
RecursiveTask 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 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(); } } |