RecursiveAction

  1. public class ForkJoinPoolAction {
  2. public static void main(String[] args) throws Exception{
  3. PrintTask task = new PrintTask(0, 300);
  4. ForkJoinPool pool = new ForkJoinPool();
  5. pool.submit(task);
  6. pool.awaitTermination(2, TimeUnit.SECONDS);
  7. pool.shutdown();
  8. }
  9. }
  10. class PrintTask extends RecursiveAction{
  11. private static final int THRESHOLD = 50; //最多只能打印50个数
  12. private int start;
  13. private int end;
  14. public PrintTask(int start, int end) {
  15. super();
  16. this.start = start;
  17. this.end = end;
  18. }
  19. @Override
  20. protected void compute() {
  21. if(end - start < THRESHOLD){
  22. for(int i=start;i<end;i++){
  23. System.out.println(Thread.currentThread().getName()+"的i值:"+i);
  24. }
  25. }else {
  26. int middle =(start+end)/2;
  27. PrintTask left = new PrintTask(start, middle);
  28. PrintTask right = new PrintTask(middle, end);
  29. //并行执行两个“小任务”
  30. left.fork();
  31. right.fork();
  32. }
  33. }
  34. }

RecursiveTask

  1. public class ForJoinPollTask {
  2. public static void main(String[] args) throws Exception {
  3. int[] arr = new int[100];
  4. Random random = new Random();
  5. int total =0;
  6. //初始化100个数组元素
  7. for(int i=0,len = arr.length;i<len;i++){
  8. int temp = random.nextInt(20);
  9. //对数组元素赋值,并将数组元素的值添加到sum总和中
  10. total += (arr[i]=temp);
  11. }
  12. System.out.println("初始化数组总和:"+total);
  13. SumTask task = new SumTask(arr, 0, arr.length);
  14. // 创建一个通用池,这个是jdk1.8提供的功能
  15. ForkJoinPool pool = ForkJoinPool.commonPool();
  16. Future<Integer> future = pool.submit(task); //提交分解的SumTask 任务
  17. System.out.println("多线程执行结果:"+future.get());
  18. pool.shutdown(); //关闭线程池
  19. }
  20. }
  21. class SumTask extends RecursiveTask<Integer>{
  22. private static final int THRESHOLD = 20; //每个小任务 最多只累加20个数
  23. private int arry[];
  24. private int start;
  25. private int end;
  26. public SumTask(int[] arry, int start, int end) {
  27. super();
  28. this.arry = arry;
  29. this.start = start;
  30. this.end = end;
  31. }
  32. @Override
  33. protected Integer compute() {
  34. int sum =0;
  35. //当end与start之间的差小于threshold时,开始进行实际的累加
  36. if(end - start <THRESHOLD){
  37. for(int i= start;i<end;i++){
  38. sum += arry[i];
  39. }
  40. return sum;
  41. }else {//当end与start之间的差大于threshold,即要累加的数超过20个时候,将大任务分解成小任务
  42. int middle = (start+ end)/2;
  43. SumTask left = new SumTask(arry, start, middle);
  44. SumTask right = new SumTask(arry, middle, end);
  45. //并行执行两个 小任务
  46. left.fork();
  47. right.fork();
  48. //把两个小任务累加的结果合并起来
  49. return left.join()+right.join();
  50. }
  51. }
  52. }