Javaアプリケーション通信のスレッド:古典的な例:プロデューサ/コンシューマ問題



/ **
*アプリケーションのスレッド間通信:古典的な例:プロデューサ/コンシューマ問題
*
*生産(Productor)製品店員(店員)に、消費者(顧客)は、店員から生成物を除去し
た後*店員のみ(例:20)製品の固定数を保持することができ、生産者はより多くの製品を生産しようとすると、店員は
商品が保管配置し、生産を継続するために生産者に知らせるためのスペースがあれば、生産の一時停止と呼ばれます*。お店であればそこには製品がありません
*、そして店が製品を奪うように消費者製品を再通知した場合店員は、消費者は数分待つ教えてくれます。
*
*分析:
* 1.マルチスレッドの問題ですか?、生産者スレッド、消費者のスレッド
* 2は、任意の共有データはありますか?はい、店員(または製品)
* 3。どのようにセキュリティ上の問題スレッドを解決するには?同期メカニズム、三つの方法があります
* 4のAreは、通信スレッドに関係しますか?である
*

* /
クラス書記{

プライベートProductCount int型= 0;
//農産物製品
ます。public void produceProduct同期(){

IF(ProductCount <20である){
ProductCount ++;
。System.out.printlnは(にThread.currentThread()のgetName()+ " :「+ productCount +」製品「)の生産を開始。

()通知;

}他{
//待機をするために
トライ{
待ち();
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}

}
//民生
ます。public void consumeProduct同期(){
IF(ProductCount> 0){
System.out.println(にThread.currentThread()のgetName() + " + productCount + "製品"最初の支出スタート");
productCount--;

通知();
} {それ以外
について//待機
トライ{
待機() ;
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}

}
}

クラスのプロデューサーは、Thread {//生产者拡張

プライベートクラーク店員を。

公共プロデューサ(店員の店員){
this.clerk =店員。
}

@Override
公共ボイドラン(){
System.out.printlnは(のgetName()+ ":开始生产产品.....")。

一方、(TRUE){

試み{
のThread.sleep(10)。
}キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}

clerk.produceProduct()。
}

}
}

クラスの消費者は、スレッドを拡張{//消费者
プライベート店員の店員。

公共消費者(店員の店員){
this.clerk =店員。
}

@Override
公共ボイドラン(){
System.out.printlnは(のgetName()+ ":开始消费产品.....")。

一方、(TRUE){

試み{
のThread.sleep(20)。
}キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}

clerk.consumeProduct()。
}
}
}

publicクラスProductTest {

パブリック静的無効メイン(文字列[] args){
クラーククラーク=新しい担当者();

プロデューサーP1 =新しいプロデューサー(店員)。
p1.setName( "生产者1")。

消費者C1は、新たな消費者(店員)を=。
c1.setName( "消费者1")。
消費者c2は、新たな消費者(店員)を=。
c2.setName( "消费者2")。

p1.start();
c1.start();
c2.start();

}
}

おすすめ

転載: www.cnblogs.com/wpy188/p/12099899.html