>  기사  >  Java  >  다중 스레드 ForkJoinPool 사례의 Java 구현

다중 스레드 ForkJoinPool 사례의 Java 구현

黄舟
黄舟원래의
2017-09-28 09:52:481525검색

이 글은 주로 Java 멀티 스레드 ForkJoinPool 예제에 대한 자세한 설명과 포크조인 프레임워크와 관련된 내용을 소개합니다.

Introduction

Java 7은 또 다른 매우 유용한 스레드 풀 프레임워크인 Fork/Join 프레임워크를 제공합니다.

Theory

Fork/Join 프레임워크는 주로 다음 두 클래스로 구성됩니다.

* ForkJoinPool. ExecutorService 인터페이스와 Work-Stealing 알고리즘을 구현한 클래스입니다. 작업자 스레드를 관리하고 작업 상태 정보와 작업 실행 정보를 제공합니다

* ForkJoinTask 이 클래스는 ForkJoinPool에서 사용될 클래스입니다.

Fork/Join 프레임워크는 작업에서 fork() 및 Join() 작업을 수행하는 메커니즘과 작업 상태를 제어하는 ​​방법을 제공합니다. 일반적으로 Fork/Join 작업을 구현하려면 구현해야 합니다. a 다음 두 클래스 중 하나의 하위 클래스

* RecursiveAction은 작업에 반환 값이 없는 시나리오에서 사용됩니다

* RecursiveTask는 작업에 반환 값이 있는 시나리오에 사용됩니다.

예를 들어, 먼저 작은 목표를 설정하세요. 1억은 너무 많습니다. 더 원한다면 100만 달러를 먼저 만드세요

이제 당신은 선전에 있는 회사의 수석 영업 관리자입니다. 이제 당신은 100만 달러를 벌겠다는 목표를 세웠습니다. 너 혼자 벌기는 확실히 어려울 거야. 다행히 우리는 평범한 부하들이 있어서 목표를 좁히고 남동생들이 벌기를 기다립니다. 좋아, 프로그래밍을 시작하자

돈 버는 일 MakeMoneyTask를 정의하세요. 돈을 벌려는 목표가 10만과 같이 최소 목표보다 적다면 직접 완료하고, 그렇지 않으면 동생들에게 작업을 할당하세요.


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;
  }
}

마지막으로 우리는 테스트 클래스 작성


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());
  }
}

작업 후 결과는 다음과 같습니다.


员工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

아니요, 0번 직원이 10명의 부하에게 100만 개의 작업을 직접 할당했고, 각 부하들은 계속해서 분배했습니다. 드디어 70명이 넘는 노력으로 100만 개가 넘는 목표가 달성됐다. 그리고 사장님은 너무 기뻐서 70명이 넘는 직원들에게 직접 배당금을 지급했다.

Postscript

위의 예를 살펴보면 많은 사람들이 마스터할 수 있다고 생각합니다. ForkJoinPool 클래스의 핵심은 대상 작업이 너무 크면 여러 하위 작업을 만드는 것입니다. . 그런 다음 하위 작업이 완료될 때까지 기다립니다.

요약

위 내용은 다중 스레드 ForkJoinPool 사례의 Java 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.