Javaの基礎 - スレッド間通信メカニズム、生産者 - 消費者

;通信パッケージ

/ * 
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(); 
    } 
}

おすすめ

転載: www.cnblogs.com/zsben991126/p/12153090.html
おすすめ