package com.engine.htsc.payment.model;


import java.util.concurrent.*;

public class TestForkJoinPool {

  private static final Integer MAX = 200;

  static class MyForkJoinTask extends RecursiveAction {
    // 子任务开始计算的值
    private Integer startValue;

    // 子任务结束计算的值
    private Integer endValue;

    public MyForkJoinTask(Integer startValue , Integer endValue) {
      this.startValue = startValue;
      this.endValue = endValue;
    }

    @Override
    protected void compute() {
      // 如果条件成立，说明这个任务所需要计算的数值分为足够小了
      // 可以正式进行累加计算了
      if(endValue - startValue < MAX) {
        System.out.println("开始计算的部分：startValue = " + startValue + ";endValue = " + endValue);
        Integer totalValue = 0;
        for(int index = this.startValue ; index <= this.endValue  ; index++) {
          totalValue += index;
        }
      }
      // 否则再进行任务拆分，拆分成两个任务
      else {
        MyForkJoinTask subTask1 = new MyForkJoinTask(startValue, (startValue + endValue) / 2);
        subTask1.fork();
        MyForkJoinTask subTask2 = new MyForkJoinTask((startValue + endValue) / 2 + 1 , endValue);
        subTask2.fork();
      }
    }
  }

  public static void main(String[] args) {
    // 这是Fork/Join框架的线程池
    ForkJoinPool pool = new ForkJoinPool();
    try {
      pool.submit(new MyForkJoinTask(1,1001));
      pool.awaitTermination(5, TimeUnit.SECONDS);
    } catch (Exception e) {
      e.printStackTrace(System.out);
    }
  }
}
