オリジナル:転載は元のアドレスを示すhttps://www.cnblogs.com/fanerwei222/p/11871704.html
Javaのスレッドを使用--BlockingQueue
キューがコンテンツの完全でブロッキングした後、彼らは彼女がコードで、表情を作るようになったことを何かがあるまで個人消費の後、目詰まりを開始します:
パッケージconcurrent.blockingqueue。 輸入java.util.concurrent.BlockingQueue; 輸入java.util.concurrent.atomic.AtomicInteger; / ** *生产者 * / パブリック クラスのプロデューサーが実装Runnableを{ / ** *计数器 * / プライベート 静的のAtomicIntegerのK = 新しいのAtomicInteger(0 ); BlockingQueueのキュー; 公共プロデューサ(BlockingQueueのキュー){ この .queue = キュー。 } @Override 公共 ボイドラン(){ 一方(trueに){ 試み{ / ** *キューに放り出さ農産物何かに * / queue.put(プロデュース()); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } } / ** その後、製造のもの、と出て返す * @return * @throws InterruptedExceptionある * / プライベートのAtomicIntegerプロデュースの()スローInterruptedExceptionある{ k.addAndGet( 1。); System.out.printlnは("プロデューサーは、物事の生産を開始..." + K); 戻り値のK; } }
パッケージconcurrent.blockingqueue; インポートjava.util.concurrent.BlockingQueue; / ** *消費者 * / パブリック クラスの消費者実装のRunnable { BlockingQueueのキュー、 公共消費(BlockingQueueのキュー){ この .queue = キュー; } @Override 公共 ボイドRUN (){ ながら、(真の){ 試みは、{ / ** その後、* 3秒の遅延とキューから削除、 *あなたは、生産キューフル生産後の生産を停止するために見ることができるので、 消費者支出の後まで生産を継続します* * / のThread.sleep( 3000 ) ;(queue.take())を消費 } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } } / ** *消費もの * @param O * / ボイド消費(オブジェクトO){ するSystem.out.println( "消費者が何かを費やして開始...." + O); } }
パッケージconcurrent.blockingqueue; インポートjava.util.concurrent.ArrayBlockingQueue; インポートjava.util.concurrent.BlockingQueue; / ** *メイン試験クラス * / パブリック クラスMainTest { 公共 静的 ボイドメイン(文字列[]引数){ / ** それは容量が詰まり始め超えた場合*のブロッキングキューの容量に従事することは、3です * / BlockingQueueのキュー = 新しい新しいとArrayBlockingQueueを(3 ); 新しい新しいスレッド(新しい新しいプロデューサー(キュー)。)開始(); 新しい新しいスレッド(新しい新しい消費者(キュー))。開始(); } }
参照結果を印刷します:
生産者は1人の...物事の生産を開始 ...プロデューサーは、物事の生産を開始 2つ の生産者は、物事を生産を開始... 3つの 生産者は、物事の生産を開始... 4つの 消費者は、物事を消費し始める.... 4 物事の生産を開始するために、生産... 5つ の消費者は、物事を消費し始めている.... 5つの 生産者は、物事を生産を開始... 6つの 消費者は、物事を消費し始める.... 6つの 生産者は、物事の生産を開始。 ... 7人の 消費者が....物事を消費し始める 7つの 生産者は、物事を生産を開始... 8つの ....消費者は、物事を消費し始める 8人の 生産者が物事を生産を開始... 9人の 消費者が何を費やして開始します.... 9つの 生産者は生産物事を開始する... 10
この結果は明らかです。