Javaは、どのようにマルチスレッド化通信を実現するために

スレッドの通信方法:

  1、共有変数

      信号を送信することによって、スレッド間の通信は、送信信号が簡単であり、共有オブジェクト内の変数のセット信号値。スレッドは、メンバ変数ブール型のシンクブロックに設けられているメンバ変数が真であるhasDataToProcess hasDataToProcessで読み出し、スレッドBは同期ブロックです。信号を保持し、セットとgetメソッドを提供するオブジェクトを使用して、この簡単な例。

  

パブリック クラスMySignal1 {
     // 共有変数
    専用ブール= hasDataToProcess falseに; 

    // 
    パブリックブールgetHasDataProcess(){
         戻りhasDataToProcess; 
    } 

    // 格納された値
    公共 ボイドsetHasDataToProcess(ブールhasDataToProcess){
         この .hasDataToProcess = hasDataToProcess; 
    } 

    公共の 静的 ボイドメイン(文字列[]引数){
         // 同じオブジェクト 
        最終MySignal1マイ= 新しい新しいMySignal1を();
         //スレッド1がtrueにhasDataToProcessが設けられている 
        スレッド= T1最終新しい新しいスレッド(新しい新しいRunnableを(){ 
            @Override 
            公共 ボイドRUN(){ 
                my.setHasDataToProcess(真の); 
            } 
        }); 
        t1.start(); 
        // スレッドがこの2を取ります値hasDataToProcess 
        スレッドT2 = 新しい新しいスレッド(新しい新しいRunnableを(){ 
            @Override 
            公共 ボイドRUN(){
                 試み{
                     // スレッド1用のウエイト値の後に終了する
                    (t1.join); 
                }キャッチ(InterruptedExceptionあるE){ 
                    e.printStackTrace(); 
                } 
                my.getHasDataProcess(); 
                システム。OUT .println(" T1の値を変更した後:" + my.getHasDataProcess()); 
            } 
        }); 
        t2.start() ; 
    } 
}

結果は以下の通りであります:

  

:T1の値を変更した後、trueに

 

  2.待ち/ウェイク(待機/通知)のメカニズム

     リソースには、例えば、生産者は消費者が生産者が資源、消費者支出の資源を生産し続ける、リソースを消費知らせるために資源を生産、このサイクルは、次の通り。

インポートsun.security.util.Password; 

// リソース
クラスリソース{
     プライベート文字列名;
     プライベート int型。COUNT = 1 ;
     プライベート ブールのフラグ= falseに

    公共の 同期 無効SET(文字列名){
         // 生産リソース
        (のフラグ){
             トライ{
                 // スレッドが待機
                (ウエイト); 
            } キャッチ(InterruptedExceptionあるE){ 
            } 
        } 
        この=名+ .nameの"----" COUNT + + "+++++" ; 
        。のSystem.out.println(にThread.currentThread()のgetName() + "メーカー... ..." + これ。名); 
        フラグ = trueに;
         // で待っている消費者のウェイク
        この.notifyAll(); 
    } 

    公共 同期 無効OUTを(){
         //はリソースを消費
        しながら!(フラグ){
             試み{
                 // スレッドは農産物資源への生産を待機します
                待機(); 
            } キャッチ(InterruptedExceptionあるE){ 
            } 
        }
        System.out.println(にThread.currentThread()のgetName()。 + "...消費者..." + この.nameの); 
        フラッグ = ;
         // 消費者のウェイク、生産リソース
        この.notifyAll(); 
    } 
} 

// メーカー
クラス生産用具のRunnable {
     プライベートリソースRS; 

    公共プロデューサ(リソースRS){
         この .RS = RS; 
    } 

    // メーカー生産リソースが
    @Override
     公共 ボイド(RUN)を{
         ながら真の){ 
            rs.set("商品" ); 
        } 
    } 
} 

// 消費支出のリソース
クラスの消費者実装のRunnable {
     プライベートリソースRS; 

    公共の消費者(リソースRS){
         この .RS = RS; 
    } 

    // 消費者支出リソースが
    @Override
     公共 無効RUNを() {
         一方真の){ 
            rs.out(); 
        } 
    } 
} 

パブリック クラスProducerConsumerDemo {
     公共 静的 ボイドメイン(文字列[]引数){
        リソースR = 新しいリソース(); 
        プロデューサP = プロデューサ(R)
        消費者Cは、 = 新しい消費者(r)を、
        スレッドT1は = 新しいスレッド(p)を。
        スレッドT2は = 新しいスレッド(c)を、
        t1.start(); 
        t2.start(); 
    } 
}

結果は以下の通りであります:

スレッド0 ..商品の生産者... 1 +++++ ---- 
スレッド -1 ...消費財... 1つの+++++ ---- 
スレッド -0プロデューサー.. ... 1件の+++++商品---- 
スレッド -1 ...消費財... 1 +++++ ---- 
スレッド -0 ..商品の生産者... --- +++++ -1 
スレッド -1 ...消費財... 1 +++++ ---- 
スレッド -0 ... 1 +++++ ----商品の生産...

 

おすすめ

転載: www.cnblogs.com/scar1et/p/11909355.html