首页 > 编程语言 > 详细

java ForkJoin 简单使用示例, 求和拆分为多个 线程执行,已提高效率

时间:2020-05-14 11:16:23      阅读:79      评论:0      收藏:0      [点我收藏+]
 1 import java.util.concurrent.ForkJoinPool;
 2 import java.util.concurrent.ForkJoinTask;
 3 import java.util.stream.LongStream;
 4 
 5 /**
 6  * @author 
 7  * @version V1.0
 8  * @Package 
 9  * @date 2020/5/14 10:13
10  */
11 // 任务合并 框架 RecursiveTask
12 public class ForkJoinSumCalculator extends java.util.concurrent.RecursiveTask<Long> {
13     //  要求和的数组
14     private final long[] numbers;
15     // 子任务的数组起始位置 和截至位置
16     private final int start;
17     private final int end;
18     // 数组内容低于 该值 则不再拆分
19     public static final long THRESHOLD = 10000;
20 
21 
22     private ForkJoinSumCalculator(long[] numbers, int start, int end) {
23         this.numbers = numbers;
24         this.start = start;
25         this.end = end;
26     }
27 
28     public ForkJoinSumCalculator(long[] numbers) {
29        this(numbers,0,numbers.length);
30     }
31 
32 
33     // 复写方法求和
34     @Override
35     protected Long compute() {
36         int length = end - start;
37         //如果内容 小于指定阈值 则不做拆分  直接返回求和结果
38         if (length <= THRESHOLD) {
39             return computeSequentially();
40         }
41         // 大于阈值 则 拆分成两个 不同的任务子进程 单独求和
42         ForkJoinSumCalculator leftTask =
43                 new ForkJoinSumCalculator(numbers, start, start + length/2);
44         // 利用一个新的线程来计算该子任务的求和
45         leftTask.fork();
46         ForkJoinSumCalculator rightTask =
47                 new ForkJoinSumCalculator(numbers, start + length/2, end);
48         // 递归调用,  方面 多次拆分,
49         Long rightResult = rightTask.compute();
50         Long leftResult = leftTask.join();
51         return leftResult + rightResult;
52     }
53 
54     private long computeSequentially() {
55         long sum = 0;
56         for (int i = start; i < end; i++) {
57 
58                 sum += numbers[i];
59             }
60             return sum;
61 
62         }
63 
64 
65         // 对外调用  接口
66     public static long forkJoinSum(long n) {
67         long[] numbers = LongStream.rangeClosed(1, n).toArray();
68         ForkJoinTask<Long> task = new ForkJoinSumCalculator(numbers);
69         return new ForkJoinPool().invoke(task);
70     }
71 
72 
73     public long[] getNumbers() {
74         return numbers;
75     }
76 
77     public int getStart() {
78         return start;
79     }
80 
81     public int getEnd() {
82         return end;
83     }
84 
85     public static long getTHRESHOLD() {
86         return THRESHOLD;
87     }
88 }

 

java ForkJoin 简单使用示例, 求和拆分为多个 线程执行,已提高效率

原文:https://www.cnblogs.com/sfchen/p/12887239.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!