待っていると、ウェイクアップ機構(スレッド間通信)

スレッド間通信

コンセプト :同じリソース上で動作する複数のスレッドが、アクション(スレッドのタスクが)同じように扱われていません。

なぜ、スレッド間通信を扱います

複数のスレッドが、我々はタスクを完了するために一緒に作業する必要がある場合、複数のスレッドの同時実行、デフォルトのCPUがランダムにスレッドを切り替えている、と我々は彼らが法律の実施を持つようにしたい場合は、それは非常に多くのスレッド間通信のいくつかの調整を必要とし、私たちは、相互運用可能なマルチスレッドのデータの達成を支援するためです。

どのようにスレッド間通信のための資源の効率的な利用を確保するために:

複数の同じリソースで作業スレッド、およびタスクが、同時に同じ変数または操作のスレッド間のスレッド間通信を解決する必要はありません。つまり、複数のスレッドが同じ共有変数の競合を避けるために、同じデータを操作しています。つまり、私たちは、資源の有効活用により、必ず各スレッドを作成する必要があります。ウェイクアップ機構を待つ - そして、これはされていることを意味します。

ウェイクアップ機構を待って

何がウェイクアップ機構を待っている: これは、複数のスレッド間の協調メカニズムです。私たちは、多くの場合、スレッドの話な競争するロックなどのスレッド(レース)との考えの競争、であるが、これは全体的な話ではありません、スレッド間の協力メカニズムが存在します。あなたとあなたの同僚は、あなたが競争の促進で存在してもよいが、より頻繁にあなたがより多くの特定のタスクを達成するために協力する会社のように。待機中の複数のスレッドがあり、もし、スレッドは、所定の操作になった後、次いで、他のスレッドのウェイク((通知))指定されたコードの完了後に実行待ち、待機状態(WAITを())に入ります必要に応じて、すべての待機中のスレッドをウェイクアップするのnotifyAll()を使用します。待っ/通知スレッド間の協調メカニズムです。

ウェイクメソッドで待機中

次のようにウェイクアップ機構を待ちはしている3つの方法の使用を意味し、スレッド間の通信の問題を解決するために使用されます。
  • 待っていない:スレッドがもはやアクティブで、もはや待機セットに、スケジューリングに関与していないので、待っている状態をスレッド、その後、ロックを競合しない、CPUリソースを無駄にしないでください。また、スケジューリングキュー(レディキュー)を再入力するために着手し、待機からスレッドのリリースを待つために、このオブジェクトに「(通知)通知すること」、つまり、特定のアクションを実行するために別のスレッドを待っています
  • 例えば、利用できるレストランの場所は、顧客が最も古いが、最初の着席食事を待って、スレッドオブジェクトの待機セットがリリースに選択された通知:通知します。
  • notifyAll:通知オブジェクト待ちセット上のすべてのスレッドが解放されます。
注意:
  • でも、待機中のスレッドに通知する場合にのみ、それは場所を中断していたので、スレッドは、すぐに実行を再開するように通知することはできないでしょう(シンクブロックではありませんが、現時点ではそれはもはやロックを保持しているので、彼女は再びロックを取得しようとする必要があります待つために呼び出しが成功した後、元のメソッドの後の場所で実行を再開するために)他のスレッドからの競争に直面しました。
次のように要約:
  • あなたがロックを取得できた場合は、待ち状態実行可能状態からスレッドの変更は、そうでない場合は、待機から出て設定し、エントリーセットに、スレッドの状態を待ちからと状態をブロックされた状態になります
待って呼び出し、通知方法は細部に注意を払う必要があります
  • 待って、通知方法の方法は、同じロックオブジェクトによって呼び出される必要があります。なぜなら:対応するロックオブジェクトがロックオブジェクトでwaitメソッドの呼び出し後、スレッドの使用を通知復帰させることができます。
  • 通知し、waitメソッドは、オブジェクトのクラスに属するメソッドです。ので:ロックオブジェクトは、任意のオブジェクトにすることができ、クラスに属する任意のオブジェクトは、Objectクラスを継承しています。
  • 通知及び待機メソッドは、同期コード・ブロックまたは同期機能の方法で使用されなければなりません。そのため:2つのロックオブジェクトを介してこのメ​​ソッドを呼び出す必要があります。

生産者と消費者問題

ウェイクアップ機構を待ち、実際に古典的な「生産者 - 消費者」問題です。
資源の有効利用のためのウェイクアップ機構を待っている消費者のパンのパンの生産を行ってください。
パン、パンの消費食料品スレッドの包子プルトニウムの糸の生産。ときバンズは時間がない(バンズ状態はfalse)包子プルトニウム糸の生産餃子を待つために、食料品のスレッド(つまり、餃子の状態が真である)、そして、それはパン、そして包子プルトニウムのスレッドあったように、(リフト食料品が待ち状態)食料品のスレッドに通知待機状態に。次に、食べる品スレッドは、ケースのさらに別の実装では、ロックに依存し得ることができます。あなたがロックを取得するために品物を食べる場合は、アクションバンの、実装、食べるパン(パンの状態はfalse)、および包子プルトニウムのスレッドに通知(解放状態包子プルトニウムを待つ)、食料品のスレッドの待機中。包子プルトニウムのスレッドは、例、さらに実装を取得することができ、ロックに依存します。
注意:
包子プルトニウムとバンズのスレッドがある - >通信相互に排他的。実行中のその一つだけのスレッドを保証するために、同期技術​​を使用する必要があります。
ロックオブジェクトはユニークです。あなたは、ロックオブジェクトのパンのようなオブジェクトを使用することができます
バオZipuクラスとクラスは、パラメータとして渡されたパンのパンのオブジェクトを必要とします
  1. 私たちは、メンバ変数の位置にパンの変数を作成する必要があります
  2. パンを割り当てるように構成されたパラメータを使用します
バンズリソースカテゴリ:
パッケージdemo01; 

パブリック クラス包子{ 
        String型のPI; 
        文字列西安; 
        ブールフラグに= falseに ; // リソースが蒸しパンのリソースの状態が存在するかどうか 
    }
包子プルトニウムのスレッドクラス:
用パッケージ変更demo01; 

パブリック クラス BaoZiPu 延びスレッド{
     // メンバ変数変数バンの位置作成する必要
    プライベート包子のBZを;
     // 変数割り当てのために利用設定パラメータ

    パブリックBaoZiPu(文字列名、包子のBZ){
         スーパー(名前);
         この = .BZ BZ; 
    } 
    // タスクスレッドを設定し、生成パン

    @Override 
    公共 ボイドRUNを(){
         int型 COUNT = 0 ; 

        ながらtrueには){
             // 同期する
            同期(BZ)を{
                 IF(== bz.flag trueに {)// 存在まんじゅうリソース
                    試し{
                         // スレッドが待ち時間入り
                        (bz.waitを); 
                    } キャッチ(InterruptedExceptionあるE){ 
                        e.printStackTrace(); 
                    } 
                } 
                // 蒸しパンを作るていない 
                システムを.out.println( "バオZipuベーキング開始" )、
                 IF(COUNT%2 == 0 ){
                     // 雪ナット 
                    bz.piは= "雪" ; 
                    bz.xian = "ナッツ" 
                }他に{
                     // クラストビーフオニオン 
                    bz.pi = "皮の薄い" ; 
                    bz.xian = "牛肉、タマネギ" ; 
                } 
                COUNT ++ ; 

                試み{
                     // 5秒のパンが生産。 
                    のThread.sleep(5000 ); 
                } キャッチ(InterruptedExceptionあるE ){ 
                    e.printStackTrace(); 
                } 
                // 生産井戸変性状態 
                bz.flag = 真の; 
                のSystem.out.println( + + bz.pi: "BUNは良好なもの" )bz.xian。
                System.out.println( "食べるために品物を食べる" );
                 // ウェイクアップ待機中のスレッド(食料品)
                bz.notifyを(); 
            } 
        } 

    } 
}
食料品のスレッドクラス:
パッケージdemo01; 

パブリック クラスは食べる拡張スレッド{
     プライベート包子のBZを、

    公共食べる(文字列名、包子のBZ){
         スーパー(名); 

        この .BZ = BZ; 
    } 

    @Override 
    公共 ボイドラン(){
         一方){
             同期(BZ){
                 場合(bz.flag == ){ 
                    するSystem.out.println( "我在吃包子" )。
                    // 3秒吃完
                    してみてください{
                        Thread.sleep( 3000 ); 
                    } キャッチ(InterruptedExceptionあるE){ 
                        e.printStackTrace(); 
                    } 
                    のSystem.out.println( "私は食べた" );
                     // 完成パン状態修飾 
                    bz.flag =をfalseに;
                     // 食べます以上、覚醒ベーキングスレッドが
                    bz.notify(); 
                    System.out.printlnは( "速いパンを行います" ); 
                } 
            } 
        } 
    } 
}

テストカテゴリ

パッケージdemo01; 

パブリック クラスは食べる拡張スレッド{
     プライベート包子のBZを、

    公共食べる(文字列名、包子のBZ){
         スーパー(名); 

        この .BZ = BZ; 
    } 

    @Override 
    公共 ボイドラン(){
         一方){
             同期(BZ){
                 場合(bz.flag == ){ 
                    するSystem.out.println( "我在吃包子" )。
                    // 3秒吃完
                    してみてください{
                        Thread.sleep( 3000 ); 
                    } キャッチ(InterruptedExceptionあるE){ 
                        e.printStackTrace(); 
                    } 
                    のSystem.out.println( "私は食べた" );
                     // 完成パン状態修飾 
                    bz.flag =をfalseに;
                     // 食べます以上、覚醒ベーキングスレッドが
                    bz.notify(); 
                    System.out.printlnは( "速いパンを行います" ); 
                } 
            } 
        } 
    } 
}

結果

包子プルトニウムはバンズのやるようになった
雪に覆われたナッツは:パンが良好なものと
品物を食べるために
私のパン
、私は終わっ
パンを行うには、高速を
包子プルトニウムがパンをやるようになりました

 

 

おすすめ

転載: www.cnblogs.com/wurengen/p/10929821.html