メッセージメッセージ本文
パッケージcom.dwz.concurrency2.chapter14。 パブリック クラスメッセージ{ プライベート文字列データ。 パブリックメッセージ(文字列データ){ この .DATAは= データ。 } パブリック文字列のgetData(){ 戻りデータ; } }
メッセージキューメッセージキュー
パッケージcom.dwz.concurrency2.chapter14。 輸入java.util.LinkedList; パブリック クラスメッセージキュー{ 民間 最終のLinkedList <メッセージ> キュー。 プライベート 静的 最終 int型の DEFAULT_MAX_LIMIT = 100 ; 民間 最終 int型の制限; パブリックメッセージキュー(){ この(DEFAULT_MAX_LIMIT)。 } パブリックメッセージキュー(最終 int型の制限){ この .limit = 限界; この .queue = 新しい LinkedListは<> (); } 公共 のボイドプット(最終メッセージのメッセージ)がスローInterruptedExceptionある{ 同期(キュー){ しばらく(queue.size()> {制限) queue.wait(); } queue.addLast(メッセージ)。 queue.notifyAll(); } } 公共のメッセージテイク()がスローInterruptedExceptionある{ 同期(キュー){ しばらく(queue.isEmpty()){ queue.wait(); } メッセージmessage = queue.removeFirst()。 queue.notifyAll(); リターン・メッセージ。 } } 公共 INT getMaxLimit(){ 戻り 、この.limitと、 } 公共 int型getMessageSize(){ 同期(キュー){ リターンqueue.size(); } } }
ProducerThreadプロデューサー
パッケージcom.dwz.concurrency2.chapter14。 輸入java.util.Randomの。 輸入java.util.concurrent.atomic.AtomicInteger; パブリック クラス ProducerThreadは拡張スレッド{ 民間 最終メッセージキューメッセージキューを。 民間 最終 静的ランダムランダム= 新しいランダム(); 民間 最終 静的のAtomicIntegerカウンタ= 新しいのAtomicInteger(0 ); 公共 ProducerThread(メッセージキューメッセージキュー、INT 配列){ スーパー( "PRODUCER-" + 配列)。 この .messageQueue = メッセージキュー; } @オーバーライド 公共 のボイドの実行(){ ながら、(真){ 試み{ メッセージメッセージ = 新しいメッセージ( "Message-" + counter.getAndIncrement())。 messageQueue.put(メッセージ)。 System.out.println(にThread.currentThread()のgetName()。 + "プット・メッセージ" + message.getData()); Thread.sleep(にRandom.nextInt( 1000年)); } キャッチ(InterruptedExceptionある電子){ ブレーク。 } } } }
ConsumerThread消費者
パッケージcom.dwz.concurrency2.chapter14。 輸入java.util.Randomの。 パブリック クラス ConsumerThreadは拡張スレッド{ 民間 最終メッセージキューメッセージキューを。 民間 最終 静的ランダムランダム= 新しいランダム(); 公共 ConsumerThread(メッセージキューメッセージキュー、INT 配列){ スーパー( "CONSUMER-" + 配列)。 この .messageQueue = メッセージキュー; } @オーバーライド 公共 のボイドの実行(){ ながら、(真){ 試み{ メッセージmessage = messageQueue.take()。 System.out.println(にThread.currentThread()のgetName() + "メッセージを取る" + message.getData())。 Thread.sleep(にRandom.nextInt( 1000年)); } キャッチ(InterruptedExceptionある電子){ ブレーク。 } } } }
テスト
パッケージcom.dwz.concurrency2.chapter14。 パブリック クラスProducerAndConsumerClient { 公共 静的 ボイドメイン(文字列[]引数){ 最終メッセージキューメッセージキュー= 新しいメッセージキュー()。 新しい ProducerThread(メッセージキュー、1 ).start(); 新しい ProducerThread(メッセージキュー、2 ).start(); 新しい ProducerThread(メッセージキュー、3 ).start(); 新しい ConsumerThread(メッセージキュー、1 ).start(); 新しい ConsumerThread(メッセージキュー、2 ).start(); } }