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 }
レンダリング: