スレッドの通信方法:
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 +++++ ----商品の生産...