JavaマルチスレッドFork JoinPoolの実例について詳しく説明します。
13085 ワード
ことばを引く
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万円ぐらいは自分で完成します。そうしないと、弟たちに任務を分け与えます。
後記
上記の例の学習を通じて、多くの人がForkJoinPoolという種類を把握できると信じています。その核心はある目標任務を完成することです。もし目標任務が大きすぎると、複数のサブタスクを作成します。そして、これらのサブタスクが完成するのをずっと待っています。
締め括りをつける
以上が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の実例について詳しく説明した内容のすべてです。皆さんの助けを期待しています。このサイトの他のテーマを参照してください。何か問題があったらいつでもメッセージを残してください。