マルチスレッド通信ロックロック

ロックインターフェースのJDK記述に従ってLock実装用いるより提供synchronized操作および利用可能な文の方法をロックするより広い範囲を。彼らは完全に異なる特性を有していてもよく、より柔軟な構造化を可能にし、関連する複数のサポートすることができるオブジェクトをCondition

Javaはsynchronizedキーワードである、とロックはインターフェースです。ロックロックは同期ロックが(ランダムウェイクつのスレッドまで)とnotisfy(スレッドのリリースにロックを遮断)と待って、synchronizedキーワードロック・スレッドの通信よりもはるかに柔軟である3スレッド間通信における内notisfyAll(すべてのスレッドを覚まします)方法。スレッド間通信は、多くの場合、資源の浪費、不必要なオーバーヘッドの形成をもたらすように、すべてのスレッドが唯一の裁判官が起き、その後、ダウンを実行するためにどのスレッドを決めることができ、糸をきっかけに指定することはできません。APIロックロックは別々に指定されたスレッドがそう同期キーワードを用いてより柔軟かつ実用的な処理スレッドの実装のための規定の場合には、ウェイクアップを提供することができます。

例えば、以下の場合:3つのスレッド、一つのスレッドに必要な印刷枚数5 1-5、1-10スレッド2印刷番号10の後に、15スレッド3 1-15プリント枚数、スレッド後の印刷番号5、スレッド10第二プリント枚数。サイクル5サイクル。

 

メソッドのロックは、通信のスレッドをロック:

 

1つの インポートjava.util.concurrent.locks.Condition。
2  インポートjava.util.concurrent.locks.Lock。
3  インポートjava.util.concurrent.locks.ReentrantLock。
4  
5  パブリック クラスPrint_01 {
 6      パブリック 静的 ボイドメイン(文字列[]引数){
 7          プリントプリント= 新しいプリント()。
8          新しい > -スレッド((){
 9              INT I <5; I ++ I = 0 ){
 10                  print.print5();
 11              }
 12         }、 "A线程" ).start();
13          新しいスレッド(() - > {
 14              のためにINT I = 0、I <5; I ++ ){
 15                  print.print10();
 16              }
 17          }、 "B线程" ).start();
18          新しいスレッド(() - > {
 19              のためにINT iが= 0; I <5; I ++ ){
 20                  print.print15();
 21              }
 22          }、 "C线程" ).start();
23      }
 24  }
 25  クラス{印刷
 26は、     プライベート int型。COUNT = 3 ;
 27      // ラッチロック使用
28      ロックロックを= 新しい新しいReentrantLockのの();
 29      条件条件conditio1 lock.newCondition =()のため;   // キー
30      の条件条件conditio2 lock.newCondition =()のため;   / / キー
31は、      条件条件conditio3のlock.newConditionため=();   // キー
32  
33である     公共 ボイド(){print5
 34は         Lock.lock();
 35          試み{
 36              // 分析
37              ながら!。(COUNTを1 =){
 38                  conditio1.await()。
39              }
 40              // 干活
41              のためにINT I 1 =、iは<= 5; I ++ ){
 42                  System.out.print(にThread.currentThread()のgetName()+。I)。
43                  のSystem.out.println();
44              }
 45              // 通知
46              カウント= 2 47              conditio2.signal()。
48          } キャッチ(例外e){
 49              e.printStackTrace();
50          }最後に{
 51は             lock.unlock();
 52である         }
 53である     }
 54である 
55      公共 ボイドprint10(){
 56は         Lock.lock();
 57である         トライ{
 58の             // スレッドが再びウェイクアップ後に複数のスレッドが、中に使用されなければならないことを決定するかを決定裁判官、それ以外の場合はfalseをウェイクアップが作成されます(3つのスレッドとよりが間違って行くだろう)
59              しばらく(COUNT = 2!{)
 60                  conditio2.await();
 61              }
 62              // 作品
63              のためのint型私は1を=; I <= 10; I ++ ){
 64                 System.out.print(。にThread.currentThread()のgetName()+ I)。
65                  のSystem.out.println();
66              }
 67              // 通知
68              数= 3 ;
69              conditio3.signal()。
70          } キャッチ(例外e){
 71              e.printStackTrace();
72          } 最後に{
 73              lock.unlock()。
74          }
 75      }
 76      公共 ボイドprint15(){
 77          lock.lock()。
78          試み{ 
80              ながら(カウント= 3!){
 81                  conditio3.await()。
82              } 
84              のためにINT I 1 =、iは<= 15; I ++ ){
 85                  System.out.print(にThread.currentThread()のgetName()+。I)。
86                  のSystem.out.println();
87              } 
89              カウント= 1 90              conditio1.signal()。
91          } キャッチ(例外e){
 92              e.printStackTrace();
93         } 最後に{
 94              lock.unlock()。
95          }
 96      }
 97 }

 

 

 

おすすめ

転載: www.cnblogs.com/fangtingfei/p/12008501.html