Javaの学習 - インタラクティブなマルチスレッド

1 - 生産者と消費者

1. スタックストアデータへの
  スレッドセーフの変換をサポートする1.1スタック
  スタックデータが0であるとき、1.2スタック境界操作を処理するスレッドが待機するアクセスプル。スタックデータが200のとき、アクセスプッシュスレッドが待機するとき
2.スタックにプッシュプロデューサー(プロデューサー)スレッドクラス、生産はランダムな大文字の提供
3.から、消費者(消費者)スレッドクラスを提供しますスタック文字をポップアップ表示し、コンソールに出力
2つの生産者と消費者3つのスレッドを同時に実行するために、テストクラスを提供4.

  1  パッケージmultiplethread。
  2  
  3  インポートjava.util.LinkedList。
  4  インポートjava.util.Listに。
  5  
  6  パブリック クラスTest_Producer_Consumer {
   7      パブリック 静的 クラススタック{
   8          リスト<文字>データ= 新しい LinkedListの<> ();
  9  
10          パブリック 同期 ボイドプッシュ(文字c){
 11              であれば(data.size()<200 ){
 12                  data.add(C);
13                  .notify()。
14              } {
 15                  のtry {
 16                      この.WAIT()。
17                  } キャッチ(InterruptedExceptionある電子){
 18                      // TODO自動生成されたcatchブロック
19                      e.printStackTrace();
20                  }
 21              }
 22          }
 23  
24          パブリック 同期キャラクタプル(){
 25              であれば(data.size()> 0 ){
 26                  文字C = data.remove(data.size() - 1);
27                  この.notify()。
28                  リターンC;
29              } {
 30                  のtry {
 31                      この.WAIT()。
32                  } キャッチ(InterruptedExceptionある電子){
 33                      // TODO自動生成されたcatchブロック
34                      e.printStackTrace();
35                  }
 36                  リターン ヌル37              }
 38  
39          }
 40  
41          公衆 同期 ボイドプリント(){
 42が              System.out.printf( "現時点でのデータ・スタックは:" +データ+ "%D \ N-の合計" 、data.size());
 43である         }
 44である     }
 45  
46である     公共の 静的 クラスプロデューサが延びスレッド{ // メーカースレッドクラス
47          ;文字列名
 48          スタックS;
 49  
50          公衆プロデューサ(スタックS、ストリング名){
 51が             この .S = S;
 52は             この .nameの= "プロデューサー" + 名;
 53です         }
 54  
55         公共 ボイドラン(){
 56              ながら){
 57                  文字c = ranChar()。
58                  s.push(C);
59                  のSystem.out.println(この .nameの+ "压入:" + C)。
60                  s.print()。
61                  試み{
 62                      この .sleep(100 )。
63                  } キャッチ(InterruptedExceptionある電子){
 64                      // TODO自動生成されたcatchブロック
65                      e.printStackTrace();
66                 }
 67              }
 68          }
 69  
70      }
 71  
72      パブリック 静的 クラスの消費者は延びスレッド{ // 消费者线程类
73          ;文字列名を
74          スタックS。
75  
76          公共消費(スタックS、文字列名){
 77              この .S = S。
78              この .nameの=「消費者」+ 名。
79          }
 80  
81          公共 ボイドラン(){
 82             一方、){
 83                  文字C = s.pull()。
84                  のSystem.out.println(この .nameの+ "弹出:" + C)。
85                  s.print()。
86                  試み{
 87                      この .sleep(100 )。
88                  } キャッチ(InterruptedExceptionある電子){
 89                      // TODO自動生成されたcatchブロック
90                      e.printStackTrace();
91                  }
 92              }
 93          }
 94     }
 95の 
96      パブリック 静的 クラス TestThread { // 特別な試験クラス
97          パブリック ボイドRUN(){
 98              スタックS = 新しい新しいスタック();
 99              INT I = 0を、I <2; I ++){ // 2生産
100                  プロデューサーP = 新しい新;プロデューサー(S、String.valueOf(I))
 101                  p.start();
 102              }
 103              INT I = 0; I <3; I ++){ // 3番目の消費者。
104                 C =コンシューマ新しい新しいコンシューマ(S、String.valueOf(I));
 105                  c.start();
 106              }
 107          }
 108      }
 109  
110      パブリック 静的文字ranChar(){ // ランダム大文字を生成
111          INT S(= INT) 'A' ;
 112          INTの E =(INT) 'Z' ;
 113          INT。N- = E - S + 1 114          INT RND =(INT)(Math.floor(Math.random()* N-)+ S) ;
 115         リターンチャー)RND。
116      }
 117  
118      公共 静的 ボイドメイン(文字列[]引数){
 119          TestThread T = 新しいTestThread()。
120          t.run()。
121  
122      }
 123 }

レンダリング:

 

おすすめ

転載: www.cnblogs.com/gilgamesh-hjb/p/12236390.html
おすすめ