マルチスレッド生産者と消費者のデザインパターン

メッセージメッセージ本文

パッケージ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();
    }
}

 

おすすめ

転載: www.cnblogs.com/zheaven/p/12160220.html