;通信パッケージ / * 2つのスレッド1と2を交互1-100印刷されている :スレッド通信 1.wait():このメソッドは、実装されている場合、現在のブロッキング状態にスレッド、ロックを解除する 2.notify():ウェイクBEをスレッド待ちの待機複数のスレッドがある場合は、優先順位の高いウェイク 3.notifyAll():目を覚ますすべてのスレッドが待機 します。説明を シンクブロックに)(通知、1.wait()、のnotifyAll()をまたは同期方法は、ロックの方法で使用することができない 。2.これらの3つの方法の呼び出し元が、オブジェクト(同期モニタ)又はブロック同期符号同期方法ロックする必要があり 、さもなければ異常 3. 3つのJavaで定義された方法で.lang.Object 睡眠()及び待機()は異なる 1宣言は、スレッドクラス宣言要約睡眠、オブジェクトが待機宣言異なる位置に 2.sleepは、任意の所望のシーンに呼び出すことができ、同期モニタによって呼び出されるのを待つ 3.sleepスレッドがロックを解除していない、待機スレッドがロックを解除 @author zsben @Create 2020年1月5日午前12時05分 * / ;インポートjava.util.concurrent.locks.ReentrantLock クラスナンバー実装Runnableを{ プライベート int型数= 100 ; プライベート ReentrantLockののロック = 新新(ReentrantLockののfalseに); @Override 公共 無効RUN(){ ながら、(真の){ 同期(本){ // 内のすべてのスレッドを覚ます のnotifyAllを(); IF(数値> 0 ) { 試み{ // スレッドがブロックされているが、ロック解除しません のThread.sleepを(100); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } 試み{ // に保持されたオブジェクトのロック解除しながら、ブロッキング状態にスレッド 待機を(); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } システム。OUT .println(にThread.currentThread()のgetName()+。" :" + 番号); 数 - ; } 他 BREAK; } } } } パブリック クラスCommunicationTest { 公共 静的 ボイドメイン(文字列[]引数){ 番号番号 = 新しい番号()。 スレッドT1は = 新しいスレッド(数) スレッドT2は = 新しいスレッド(数) スレッドt3は = 新しいスレッド(数); t1.start(); t2.start(); t3.start(); } }
以下は、生産者と消費者の例であり、
通信パッケージ; / * 生産者と消費者が気付いて @author zsben @Create 2020年1月5日13時55 * / クラス書記{ プライベート int型 ProductCount = 0 ; // 製品:アトミックオペレーション 公共同期無効produceProductを(){ IF(ProductCount < 20である{) ProductCount ++ ; 。システムOUTの .println(にThread.currentThread()のgetName()+。" 生産品" + ProductCount); 通知(); } 他{ 試し{ ;)待機( } キャッチ(InterruptedExceptionあるE){ ; e.printStackTrace() } } } // アトミック操作:消費者の 公共同期無効consumerProduct(){ IF(ProductCount> 0 ){ システム。OUTの .println(スレッド。.currentThread()のgetName()+ " 消費者製品" + ProductCount); ProductCount - ; 通知(); } 他{ 試す{ 待機を(); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } } クラスプロデューサースレッド{延び プライベート店員の店員と、 公共プロデューサ(店員の店員){ // 生产者 この .clerk = 店員。 } @Override 公共 ボイドラン(){ システム。アウト .println(のgetName()+ " :开始生产产品... " ); しばらく(真){ 試みる{ のThread.sleep(10 )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } clerk.produceProduct()。 } } } クラスの消費者は、Thread {拡張// 消费者 プライベートクラーク店員を。 公共消費者(店員の店員){ この .clerk = 店員。 } @Override 公共 ボイドラン(){ システム。アウト .println(のgetName()+ ":开始消费产品... " ); ながら、(真){ 試み{ のThread.sleep(10 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } clerk.consumerProduct(); } } } パブリック クラスProductTest { 公共 静的 ボイドメイン(文字列[]引数){ クラーククラーク = 新しい担当者(); プロデューサーP1 = 新しいプロデューサー(店員)。 p1.setName("プロデューサー1。" ); 消費者C1 = 新しい新しい消費者(店員); c1.setName(" 消費者1。" ); p1.start(); c1.start(); } }