Home  >  Article  >  Java  >  Java implementation of multi-threaded ForkJoinPool case

Java implementation of multi-threaded ForkJoinPool case

黄舟
黄舟Original
2017-09-28 09:52:481525browse

This article mainly introduces the detailed explanation of Java multi-threaded ForkJoinPool examples and related content related to the forkjoin framework. Friends in need can refer to it.

Introduction

Java 7 provides another very useful thread pool framework, the Fork/Join framework

Theory

The Fork/Join framework mainly consists of the following two classes.

* ForkJoinPool This class implements the ExecutorService interface and the work-stealing algorithm (Work- Stealing Algorithm). It manages worker threads and provides task status information and task execution information

* ForkJoinTask This class is a task that will be executed in ForkJoinPool Base class.

The Fork/Join framework provides a mechanism to perform fork() and join() operations in a task and a method to control the task status. Usually, in order to implement a Fork/Join task, you need Implement a subclass of one of the following two classes

* RecursiveAction is used in scenarios where the task has no return value

* RecursiveTask is used in scenarios where the task has a return value.

Example: Set a small goal first. 100 million is too much. Let’s earn one million first.

Now you are a senior sales manager of a company in Shenzhen area. . Now we have set a goal, which is to make a hundred dollars. It will definitely be difficult for you to earn it alone. Fortunately, we have ordinary subordinates, so we can narrow the goal and let the younger brothers earn it. We will wait for the money. OK, let's start. Programming

First we need to define a money-making task MakeMoneyTask. If the goal of making money is less than the minimum goal, such as one hundred thousand, then complete it yourself, otherwise, assign the task to the younger brothers.


public class MakeMoneyTask extends RecursiveTask<Integer>{
  private static final int MIN_GOAL_MONEY = 100000;
  private int goalMoney;
  private String name;
  private static final AtomicLong employeeNo = new AtomicLong();
  public MakeMoneyTask(int goalMoney){
    this.goalMoney = goalMoney;
    this.name = "员工" + employeeNo.getAndIncrement() + "号";
  }
  @Override
  protected Integer compute() {
    if (this.goalMoney < MIN_GOAL_MONEY){
      System.out.println(name + ": 老板交代了,要赚 " + goalMoney + " 元,为了买车买房,加油吧....");
      return makeMoney();
    }else{
      int subThreadCount = ThreadLocalRandom.current().nextInt(10) + 2;
      System.out.println(name + ": 上级要我赚 " + goalMoney + ", 有点小多,没事让我" + subThreadCount + "个手下去完成吧," +
          "每人赚个 " + Math.ceil(goalMoney * 1.0 / subThreadCount) + "元应该没问题...");
      List<MakeMoneyTask> tasks = new ArrayList<>();
      for (int i = 0; i < subThreadCount; i ++){
        tasks.add(new MakeMoneyTask(goalMoney / subThreadCount));
      }
      Collection<MakeMoneyTask> makeMoneyTasks = invokeAll(tasks);
      int sum = 0;
      for (MakeMoneyTask moneyTask : makeMoneyTasks){
        try {
          sum += moneyTask.get();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
      System.out.println(name + ": 嗯,不错,效率还可以,终于赚到 " + sum + "元,赶紧邀功去....");
      return sum;
    }
  }
  private Integer makeMoney(){
    int sum = 0;
    int day = 1;
    try {
      while (true){
        Thread.sleep(ThreadLocalRandom.current().nextInt(500));
        int money = ThreadLocalRandom.current().nextInt(MIN_GOAL_MONEY / 3);
        System.out.println(name + ": 在第 " + (day ++) + " 天赚了" + money);
        sum += money;
        if (sum >= goalMoney){
          System.out.println(name + ": 终于赚到 " + sum + " 元, 可以交差了...");
          break;
        }
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return sum;
  }
}

Finally we write a test class


public class TestMain {
  public static void main(String[] args) throws ExecutionException, InterruptedException {
    ForkJoinPool pool = new ForkJoinPool();
    ForkJoinTask<Integer> task = pool.submit(new MakeMoneyTask(1000000));
    do {
      try {
        TimeUnit.MILLISECONDS.sleep(5);
      }catch (InterruptedException e){
        e.printStackTrace();
      }
    }while (!task.isDone());
    pool.shutdown();
    System.out.println(task.get());
  }
}

The result after operation is as follows:


员工0号: 上级要我赚 1000000, 有点小多,没事让我10个手下去完成吧,每人赚个 100000.0元应该没问题… 
员工1号: 上级要我赚 100000, 有点小多,没事让我7个手下去完成吧,每人赚个 14286.0元应该没问题… 
员工11号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工10号: 上级要我赚 100000, 有点小多,没事让我5个手下去完成吧,每人赚个 20000.0元应该没问题… 
员工18号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 
员工9号: 上级要我赚 100000, 有点小多,没事让我3个手下去完成吧,每人赚个 33334.0元应该没问题… 
员工23号: 老板交代了,要赚 33333 元,为了买车买房,加油吧…. 
员工22号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 
员工22号: 在第 1 天赚了31432 
员工22号: 终于赚到 31432 元, 可以交差了… 
员工21号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 
员工18号: 在第 1 天赚了32005 
员工18号: 终于赚到 32005 元, 可以交差了… 
员工19号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 
员工23号: 在第 1 天赚了6166 
员工21号: 在第 1 天赚了15433 
员工19号: 在第 1 天赚了23419 
员工19号: 终于赚到 23419 元, 可以交差了… 
员工20号: 老板交代了,要赚 20000 元,为了买车买房,加油吧…. 
员工20号: 在第 1 天赚了10376 
员工11号: 在第 1 天赚了11808 
员工21号: 在第 2 天赚了31059 
员工21号: 终于赚到 46492 元, 可以交差了… 
员工8号: 上级要我赚 100000, 有点小多,没事让我4个手下去完成吧,每人赚个 25000.0元应该没问题… 
员工26号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 
员工11号: 在第 2 天赚了11902 
员工11号: 终于赚到 23710 元, 可以交差了… 
员工12号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工23号: 在第 2 天赚了9077 
员工20号: 在第 2 天赚了30386 
员工20号: 终于赚到 40762 元, 可以交差了… 
员工10号: 嗯,不错,效率还可以,终于赚到 174110元,赶紧邀功去…. 
员工7号: 上级要我赚 100000, 有点小多,没事让我10个手下去完成吧,每人赚个 10000.0元应该没问题… 
员工30号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工12号: 在第 1 天赚了31271 
员工12号: 终于赚到 31271 元, 可以交差了… 
员工26号: 在第 1 天赚了11631 
员工13号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工26号: 在第 2 天赚了10160 
员工30号: 在第 1 天赚了10786 
员工30号: 终于赚到 10786 元, 可以交差了… 
员工31号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工31号: 在第 1 天赚了15201 
员工31号: 终于赚到 15201 元, 可以交差了… 
员工32号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工26号: 在第 3 天赚了32642 
员工26号: 终于赚到 54433 元, 可以交差了… 
员工27号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 
员工23号: 在第 3 天赚了33072 
员工23号: 终于赚到 48315 元, 可以交差了… 
员工24号: 老板交代了,要赚 33333 元,为了买车买房,加油吧…. 
员工24号: 在第 1 天赚了26309 
员工24号: 在第 2 天赚了15420 
员工24号: 终于赚到 41729 元, 可以交差了… 
员工25号: 老板交代了,要赚 33333 元,为了买车买房,加油吧…. 
员工13号: 在第 1 天赚了33266 
员工13号: 终于赚到 33266 元, 可以交差了… 
员工14号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工25号: 在第 1 天赚了19270 
员工25号: 在第 2 天赚了15842 
员工25号: 终于赚到 35112 元, 可以交差了… 
员工9号: 嗯,不错,效率还可以,终于赚到 125156元,赶紧邀功去…. 
员工6号: 上级要我赚 100000, 有点小多,没事让我9个手下去完成吧,每人赚个 11112.0元应该没问题… 
员工40号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工32号: 在第 1 天赚了8133 
员工32号: 在第 2 天赚了3518 
员工32号: 终于赚到 11651 元, 可以交差了… 
员工33号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工27号: 在第 1 天赚了23200 
员工14号: 在第 1 天赚了6366 
员工27号: 在第 2 天赚了10406 
员工27号: 终于赚到 33606 元, 可以交差了… 
员工28号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 
员工40号: 在第 1 天赚了28078 
员工40号: 终于赚到 28078 元, 可以交差了… 
员工41号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工41号: 在第 1 天赚了12996 
员工41号: 终于赚到 12996 元, 可以交差了… 
员工42号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工33号: 在第 1 天赚了29188 
员工33号: 终于赚到 29188 元, 可以交差了… 
员工34号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工14号: 在第 2 天赚了17712 
员工14号: 终于赚到 24078 元, 可以交差了… 
员工15号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工28号: 在第 1 天赚了18623 
员工28号: 在第 2 天赚了8205 
员工28号: 终于赚到 26828 元, 可以交差了… 
员工29号: 老板交代了,要赚 25000 元,为了买车买房,加油吧…. 
员工34号: 在第 1 天赚了30779 
员工34号: 终于赚到 30779 元, 可以交差了… 
员工35号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工42号: 在第 1 天赚了26164 
员工42号: 终于赚到 26164 元, 可以交差了… 
员工43号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工43号: 在第 1 天赚了2995 
员工29号: 在第 1 天赚了347 
员工15号: 在第 1 天赚了33056 
员工15号: 终于赚到 33056 元, 可以交差了… 
员工16号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工35号: 在第 1 天赚了3639 
员工29号: 在第 2 天赚了22909 
员工43号: 在第 2 天赚了2289 
员工16号: 在第 1 天赚了27836 
员工16号: 终于赚到 27836 元, 可以交差了… 
员工17号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工43号: 在第 3 天赚了694 
员工17号: 在第 1 天赚了16361 
员工17号: 终于赚到 16361 元, 可以交差了… 
员工1号: 嗯,不错,效率还可以,终于赚到 189578元,赶紧邀功去…. 
员工2号: 上级要我赚 100000, 有点小多,没事让我2个手下去完成吧,每人赚个 50000.0元应该没问题… 
员工49号: 老板交代了,要赚 50000 元,为了买车买房,加油吧…. 
员工49号: 在第 1 天赚了8599 
员工43号: 在第 4 天赚了10008 
员工43号: 终于赚到 15986 元, 可以交差了… 
员工44号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工29号: 在第 3 天赚了31298 
员工29号: 终于赚到 54554 元, 可以交差了… 
员工8号: 嗯,不错,效率还可以,终于赚到 169421元,赶紧邀功去…. 
员工39号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工49号: 在第 2 天赚了8099 
员工35号: 在第 2 天赚了164 
员工49号: 在第 3 天赚了5518 
员工49号: 在第 4 天赚了22441 
员工44号: 在第 1 天赚了6091 
员工39号: 在第 1 天赚了18813 
员工39号: 终于赚到 18813 元, 可以交差了… 
员工48号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工44号: 在第 2 天赚了22324 
员工44号: 终于赚到 28415 元, 可以交差了… 
员工45号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工49号: 在第 5 天赚了28438 
员工49号: 终于赚到 73095 元, 可以交差了… 
员工50号: 老板交代了,要赚 50000 元,为了买车买房,加油吧…. 
员工35号: 在第 3 天赚了31797 
员工35号: 终于赚到 35600 元, 可以交差了… 
员工36号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工50号: 在第 1 天赚了18071 
员工45号: 在第 1 天赚了22528 
员工45号: 终于赚到 22528 元, 可以交差了… 
员工46号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工36号: 在第 1 天赚了26828 
员工36号: 终于赚到 26828 元, 可以交差了… 
员工37号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工50号: 在第 2 天赚了32422 
员工50号: 终于赚到 50493 元, 可以交差了… 
员工2号: 嗯,不错,效率还可以,终于赚到 123588元,赶紧邀功去…. 
员工3号: 上级要我赚 100000, 有点小多,没事让我9个手下去完成吧,每人赚个 11112.0元应该没问题… 
员工51号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工46号: 在第 1 天赚了1537 
员工46号: 在第 2 天赚了27529 
员工46号: 终于赚到 29066 元, 可以交差了… 
员工47号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工48号: 在第 1 天赚了24791 
员工48号: 终于赚到 24791 元, 可以交差了… 
员工38号: 老板交代了,要赚 10000 元,为了买车买房,加油吧…. 
员工37号: 在第 1 天赚了17587 
员工37号: 终于赚到 17587 元, 可以交差了… 
员工47号: 在第 1 天赚了23693 
员工47号: 终于赚到 23693 元, 可以交差了… 
员工6号: 嗯,不错,效率还可以,终于赚到 211717元,赶紧邀功去…. 
员工5号: 上级要我赚 100000, 有点小多,没事让我7个手下去完成吧,每人赚个 14286.0元应该没问题… 
员工60号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工51号: 在第 1 天赚了27189 
员工51号: 终于赚到 27189 元, 可以交差了… 
员工52号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工38号: 在第 1 天赚了32285 
员工38号: 终于赚到 32285 元, 可以交差了… 
员工66号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工7号: 嗯,不错,效率还可以,终于赚到 228718元,赶紧邀功去…. 
员工65号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工65号: 在第 1 天赚了26122 
员工65号: 终于赚到 26122 元, 可以交差了… 
员工64号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工52号: 在第 1 天赚了19239 
员工52号: 终于赚到 19239 元, 可以交差了… 
员工53号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工60号: 在第 1 天赚了10433 
员工66号: 在第 1 天赚了25993 
员工66号: 终于赚到 25993 元, 可以交差了… 
员工63号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工60号: 在第 2 天赚了19529 
员工60号: 终于赚到 29962 元, 可以交差了… 
员工61号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工64号: 在第 1 天赚了6894 
员工53号: 在第 1 天赚了13114 
员工53号: 终于赚到 13114 元, 可以交差了… 
员工54号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工54号: 在第 1 天赚了8237 
员工61号: 在第 1 天赚了15878 
员工61号: 终于赚到 15878 元, 可以交差了… 
员工62号: 老板交代了,要赚 14285 元,为了买车买房,加油吧…. 
员工63号: 在第 1 天赚了32108 
员工63号: 终于赚到 32108 元, 可以交差了… 
员工4号: 上级要我赚 100000, 有点小多,没事让我9个手下去完成吧,每人赚个 11112.0元应该没问题… 
员工67号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工64号: 在第 2 天赚了30531 
员工64号: 终于赚到 37425 元, 可以交差了… 
员工75号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工54号: 在第 2 天赚了13562 
员工54号: 终于赚到 21799 元, 可以交差了… 
员工55号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工55号: 在第 1 天赚了17774 
员工55号: 终于赚到 17774 元, 可以交差了… 
员工56号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工67号: 在第 1 天赚了24463 
员工67号: 终于赚到 24463 元, 可以交差了… 
员工68号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工56号: 在第 1 天赚了1677 
员工62号: 在第 1 天赚了14266 
员工75号: 在第 1 天赚了26532 
员工75号: 终于赚到 26532 元, 可以交差了… 
员工74号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工68号: 在第 1 天赚了32639 
员工68号: 终于赚到 32639 元, 可以交差了… 
员工69号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工69号: 在第 1 天赚了9513 
员工56号: 在第 2 天赚了9154 
员工56号: 在第 3 天赚了289 
员工56号: 终于赚到 11120 元, 可以交差了… 
员工57号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工62号: 在第 2 天赚了17321 
员工62号: 终于赚到 31587 元, 可以交差了… 
员工5号: 嗯,不错,效率还可以,终于赚到 199075元,赶紧邀功去…. 
员工59号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工69号: 在第 2 天赚了17971 
员工69号: 终于赚到 27484 元, 可以交差了… 
员工70号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工74号: 在第 1 天赚了26270 
员工74号: 终于赚到 26270 元, 可以交差了… 
员工73号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工70号: 在第 1 天赚了21237 
员工70号: 终于赚到 21237 元, 可以交差了… 
员工71号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工59号: 在第 1 天赚了4411 
员工57号: 在第 1 天赚了3546 
员工57号: 在第 2 天赚了29330 
员工57号: 终于赚到 32876 元, 可以交差了… 
员工58号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工73号: 在第 1 天赚了10674 
员工71号: 在第 1 天赚了8821 
员工59号: 在第 2 天赚了11887 
员工59号: 终于赚到 16298 元, 可以交差了… 
员工72号: 老板交代了,要赚 11111 元,为了买车买房,加油吧…. 
员工58号: 在第 1 天赚了28241 
员工58号: 终于赚到 28241 元, 可以交差了… 
员工3号: 嗯,不错,效率还可以,终于赚到 187650元,赶紧邀功去…. 
员工72号: 在第 1 天赚了14371 
员工72号: 终于赚到 14371 元, 可以交差了… 
员工73号: 在第 2 天赚了14918 
员工73号: 终于赚到 25592 元, 可以交差了… 
员工71号: 在第 2 天赚了28814 
员工71号: 终于赚到 37635 元, 可以交差了… 
员工4号: 嗯,不错,效率还可以,终于赚到 236223元,赶紧邀功去…. 
员工0号: 嗯,不错,效率还可以,终于赚到 1845236元,赶紧邀功去…. 
1845236

Did you see that employee No. 0 directly assigned the task of 1 million to 10 subordinates? Each subordinate continued to distribute it downwards, and finally the number 70 or so was With hard work, the goal was finally achieved - one million. And it exceeded more than 800,000. The boss was so happy that he directly distributed more than 800,000 to the more than 70 employees as dividends.

Postscript

Through the study of the above example, I believe that many people can master the ForkJoinPool class. Its core is to complete a certain target task. If the target task is too large , then create multiple subtasks. Then wait for these subtasks to be completed. Finally complete the previously set target task.

Summary

The above is the detailed content of Java implementation of multi-threaded ForkJoinPool case. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn