https://www.cnblogs.com/clamp7724/p/11648308.html
マルチスレッドに基づいて内蔵のベクトルJavaのセキュリティスレッドを使用してください。
ハンドルをロックするようにしてください
スレッドロック:
同期
同期の修正方法を用いて、このメソッドは、他のオブジェクトの解放を使用することを可能にするために使用した後にのみ、現在のオブジェクトがロックされている場合は、このメソッドを呼び出します。
これは、複数のオブジェクトが同時にそのような配送方法、物品、ならびに貨物裁判官があるかどうかを決定する方法として実行スレッドの問題(その結果、メソッドにアクセス追加しないことがあり、Bの方法は、次に、単に逃げます商品、エラーが商品を取得を開始します)
ます。public void同期メソッド名(){...}
か
同期コードを実行した後{...}アンロック(ロックされたオブジェクトは、必要に応じて)
スレッド制御:
待ち時間:
はObject.wait()CPUは(限り、スレッドが出て死ぬかエラーしないように、CPUの空き時間に自動的にそれを実行するためにリソースを割り当てます)再びリソースを割り当てるまで、待ち状態にオブジェクトのスレッドの実装を許可し、ここで注意を払いますオブジェクトの操作は、スレッド、同じオブジェクトを操作する複数の単一スレッド化され、1つのスレッドの動作オブジェクトを入力するために待機している他のスレッドには影響を与えません。
あなたはthis.wait方法で書く場合は();待機状態に、現在のオブジェクトの現在のクラスは、スレッドオブジェクトではなく動作しています。例えば、AがBのメソッドを呼び出し、このメソッドが壊れてこのスレッドを(もはやダウン継続)を実行するために、)(this.waitを有し、ウェイクアップが進む前に待ちます。これは、CにBへの呼び出しには影響を与えません。
待機()---「仮死状態にすべてのスレッド。
仮死スレッドウェイクを防ぐために時間を見つける必要があり
Object.notify:
ウェイクアップ現在のオブジェクト(CPU優先度を決定し、または事前に(int型優先)object.setPriorityで優先順位を設定されているスレッド、優先順位1〜10、最高10 )
Object.notifyAll:
すべてのスレッドがオブジェクトを覚まします。
消費者モデルの生産:
それは倉庫に置かれたが、一部の人が倉庫から、倉庫の操作が同時に同じ人で取ります。
主な機能
パッケージmulti_thread。 パブリック クラスMultiThreadTest { 公共 静的 ボイドメイン(文字列[]引数){ 顧客C1 = 新規顧客( "消费者1" )。 顧客C2 = 新しい顧客( "消费者2" ); カスタマーC3 = 新しい顧客( "消费者3" ); カスタマーC4 = 新しい顧客( "消费者4" ); Productor p1の = 新しい Productor( "生产者1" ); Productor p2を = 新しい Productor(」); // プロデューサー優先度の高い、消費者の最初の生産 p1.setPriority(10 ); p2.setPriority( 10 ); // 最初の10社の製品、4人の消費者が存在し、一人につき2生産を20を買います少なくとも20回は、(それが購入することが生産する消費率>生産速度ではなく、十分な時間)買うがあるだろうことを意味する、一人あたり25を生産者 c1.startを(); c2.start(); C3。開始(); c4.start(); p1.start(); p2.start(); } }
消費者
パッケージmulti_thread; パブリック クラスカスタマーが拡張スレッド{ // 消費者が商品を取る買う プライベート文字列名を、 公共のお客様(文字列名){ この .nameの= 名; } 公共 ボイドRUN(){ のために(int型 I = 0;私は< 20であり; I ++){ // 各消費者製品20が必要と仮定 )buyGoodを(; } } プライベート ボイド(){buyGoodを 商品G = Goods.getInstance(); 文字列s = g.removeGoodを(); // ロックマルチスレッド・コード{}の外側部分に(オブジェクトをロック)同期を加え、別の方法 // ロックのこの方法と同様の効果を得る // 同期(G){ // S = G. removeGood(); // } IF(S =!ヌル){ System.out.printlnは(名前 + "買った" + S); } 他{ System.out.printlnは(名前 "!在庫切れのそれを見つけます" + ); } } }
プロデューサー
パッケージmulti_thread、 パブリック クラス Productor 延びスレッド{ // 貨物増加、メーカー プライベート文字列名を、 パブリックProductor(文字列名){ この .nameの= 名; } 公共 ボイドRUN(){ ため(int型 I 0 =;私は30 < ; I ++){ // 各ちょうど消費者満たすために、生産する製品30台の生産を停止すると仮定する )productGoodを(; } } プライベート ボイドproductGoodを(){ 商品G = Goods.getInstance(); 文字列s =g.addGood(); System.out.printlnは(名 + "生成" + S); } }
貨物倉庫
パッケージmulti_thread、 インポートjava.util.ArrayListのの、 パブリック クラス製品{ // 貨物倉庫、貨物表される文字列 プライベート INT NUM = 1; // 商品を区別するために使用される プライベート 静的グッズグッズ= 新しい新製品(); プライベートのArrayListを<文字列> = goodList 新しい新しいのArrayList <>(); // 新しいクラスを作成するにはあまりにも怠惰な、品物を表現するために、文字列を使用します。。。 { について(INT I = 0; I ++は、I 20は、< ){ addGood(); } } // コンストラクタ、物品が最初に添加20 プライベートグッズ(){ } 公共 静的財のgetInstance(){ 戻りグッズ; } // 貨物生成 パブリック 同期ストリングaddGood(){ // 使用同期ロック方法をので、実装が放出するようにした後、製品のオブジェクトは、ロックされている場合、このメソッドを呼び出します。 goodList.add( "カーゴ" + NUM); NUM ++ ; リターン "商品" + NUMは、// 商品生成名を返す } // 貨物消費 パブリック 同期ストリングremoveGoodを(){ IF(goodList.size()> 0 ){ 文字列S = goodList.remove(0); 戻り S; //は、消費財の名前を返します。 } 他{ 試み{ // 待ち時間が商品のスレッドはありませんが、スレッド(消費者のみ)このメソッドこのメソッドの実装を呼び出し、現在のオブジェクト のSystem.out.printlnを( 「それは、在庫切れの場合は、ので、それはそこには移動しない」+ NUM +「とは、品物がいることがわかった」); // this.notifyAllを()を添加していない;の場合: // この文の実行を4回を見つけました(生産者>の個人消費率が速度を生成するため、生産は完売し、十分な時間)、4人の消費者が生産に2つだけの生産はまだ、物事を買いませんでした。 // 仮死状態:プログラムカードは、もはやとして知られ、ここでは継続しません。 // スレッドが待機状態に入ったときに仮死を防ぐために、他のスレッドを覚まします。 // // 通知 この .notifyAllを(); //----フレーズを追加した後、スレッドが正常に完了することができます。一部の消費者が在庫切れ見つけた後、時間をかけて(彼は目が覚めたように、他の消費者が在庫切れの発見)購入の上に再試行します この.WAIT(); } キャッチ(例外e){ e.printStackTrace(); } 戻り ヌル。 } } }