JavaマルチスレッドFork JoinPoolの実例について詳しく説明します。


ことばを引く
java 7は、他の有用なスレッドプールフレーム、Fork/Joinフレームワークを提供しています。
理論
Fork/Joinフレームは主に以下の二つの種類があります。
*ForkJoinPoolこのクラスは、ExectorServiceインターフェースとジョブの盗撮アルゴリズム(Work-Staring Algorithm)を実現しました。これは、作業者のスレッドを管理し、タスクのステータス情報とタスクの実行情報を提供します。
*ForkJoinTaskこのクラスはForkJoinPoolで実行されるタスクのベースクラスです。
Fork/Joinフレームワークは、一つのタスクの中でfork()とジョイン()の動作を実行する仕組みとタスク状態を制御する方法を提供しています。通常、Fork/Joinタスクを実現するためには、次の2つのカテゴリのうちの1つを実現する必要があります。
*RecursiveActionは、ジョブがリターン値を持たないシーンに使用します。
*Recursive Taskは、タスクが戻り値を持つシーンに使用します。
例はまず小さい目標を決めて、1億は多すぎて、先に百万を儲けるようにしましょう。
今は深圳片区のある会社の高級販売主管です。目標を決めました。百を儲けるということです。一人で稼ぐのは難しいです。幸いにも普通の部下がいて、目標を縮小して、弟達に儲けるようにしています。ok、プログラミングを始めます。
まず、お金を稼ぐ任務を定義します。もしお金を稼ぐ目標が最小目標より小さいなら、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人の部下に分けて行って、すべての手下は引き続き下へ分けることがいて、最後に七十何日(号)人の努力のもとで、ついに目標C百万を完成しました。
後記
上記の例の学習を通じて、多くの人がForkJoinPoolという種類を把握できると信じています。その核心はある目標任務を完成することです。もし目標任務が大きすぎると、複数のサブタスクを作成します。そして、これらのサブタスクが完成するのをずっと待っています。
締め括りをつける
以上がJavaマルチスレッドFork JoinPoolの実例について詳しく説明した内容のすべてです。皆さんの助けを期待しています。このサイトの他のテーマを参照してください。何か問題があったらいつでもメッセージを残してください。