シンプルなブロッキングキューにそれを書き換えること(ArrayListを)考えると、要件は入れてメソッドを取得しており、複数の生産者と消費者の複数のスレッド混雑コールをサポートできるのgetSize方法。
1] ReentrantLockのための同期ロックまたはロックを使用
1]のウェイトの使用目的、通知、のnotifyAll達成するために
基本的な考え方:コンテナへの追加要素は、その後、待機()メソッドを呼び出して追加のスレッドブロックを使用する使用方法に置いたとき、コンテナが満杯になった場合、裁判官に要素を追加するために、putメソッドを使用して、コンテナからのgetメソッドの削除要素を使用しますそして、再びコンテナスペース、コンテナがすでに空である場合、この時間は待機()メソッドを呼び出すために、要素を取得するにはgetメソッドを使用して同じ道を作る要素を追加するために、消費者の糸要素を、アウト待ちますので、スレッドが要素を遮断することその後、空のコンテナから要素を削除しないコンテナに要素を追加するためにスレッドを追加待ちます
パブリック クラス MyArrayBlockingQueue <T> { / * 引数なしで*コールコンストラクタ、ブロッキングキューのデフォルトの長さ * / パブリック 静的 最終 int型 SIZE_VALUE = 10 ; / * *キューコンテナ記憶素子キュー * / 公共の 最終リスト<T>リスト= 新しい新規のArrayList <> (); / * キューの*最大容量 * / プライベート 最終 INT maxSizeの; / * キュー内の要素の現在の数* * / プライベート int型のサイズ= 0 ; 公共MyArrayBlockingQueue(){ スーパー()。 この .maxSize = SIZE_VALUE; } / ** *パラメータ化コンストラクタは、最大キュー要素作成するときにセットしてもよい * @paramの数のmaxSizeの最大キュー要素 * / パブリック MyArrayBlockingQueue(INT maxSizeの){ この .maxSize = maxSizeのを; } / * * *この方法は、容器への生産インサート要素と呼ばれる * @paramの到来キューからT * @throws InterruptedExceptionある例外が上方スレッド割り込みをスローされる * / 公共 同期 ボイド PUT(T T)がスローInterruptedExceptionある{ ながら(リストの.size()== maxSizeの){ System.out.println( "キュー要素の数" + maxSizeの+ "番目、ブロッキング状態にキュー" ); この.WAIT(); } (T)lists.add; ++ サイズ; のSystem.out.println(「サイズの要素数の要素の生産:」+サイズ+「」); この .notifyAll(); // ウェイクアップスレッドの消費の消費量 } / ** *消費者がコンテナから要素を取ったときに呼び出されるメソッド * / 公共 同期T GET (){ T T = NULL ; 一方(lists.size()== 0 ){ 試み{ この.WAIT(); }キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } T = lists.get(0 ); lists.remove( 0 ); - サイズ; のSystem.out.println( "消費者サイズにコンテナ内の要素の数:" +サイズ+ "" ); この .notifyAll(); // ウェイクアップ生産スレッド生産 戻りT; } / ** *キュー内の要素の現在の数 * / パブリック INT のgetSize(){ 戻りサイズ; } }
テスト結果:
データから見つかった最初のテストは、0であり、後にgetメソッドでは、値は0、ビット不注意です取るにつながる、失われた要素の削除を削除することを忘れて、見ていました。
疲れの他のセットが、それはまた、ブロッキングキューに変換することができ、あなたが試すことができます