パッケージテスト。 輸入java.awt.List; 輸入java.awt.image.AreaAveragingScaleFilter。 輸入java.lang.reflect.Array。 インポートのjava.math.BigDecimal; インポートがjava.math.BigInteger; 輸入java.utilの。*; 輸入java.util.concurrent.CountDownLatch。 輸入java.util.concurrent.locks.Condition。 輸入java.util.concurrent.locks.Lock。 輸入java.util.concurrent.locks.ReentrantLock。 輸入java.io.BufferedInputStreamの。 輸入java.io.OutputStreamWriterが、 輸入てjava.io.PrintWriter; インポートするjava.io.Reader; インポートのjava.io.Writer; 輸入javax.security.auth.callback.LanguageCallback; 輸入javax.swing.text.StyledEditorKit.BoldAction。 クラスのリソース教材{ プライベート文字列名; プライベートブールフラグ= falseは、 プライベートint型の数; ロックロック=新しいReentrantLockの(); 条件proCondition = lock.newCondition()。 条件条件= lock.newCondition()。 公共ボイドプット(文字列名){ lock.lock(); {試みる 一方(フラグ){ {試みる )(proCondition.awaitします。 }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } フラグ= TRUE。 ++数えます。 this.name =名+数えます。 condition.signal(); }最後に{ lock.unlock()。 } } 公共ボイドテイク(){ lock.lock(); してみてください{ (フラグ!){ながら {みてください )(condition.await。 }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } フラグ= FALSE。 System.out.println(にThread.currentThread()のgetName()+ "......" + this.name)。 proCondition.signal(); }最後に{ lock.unlock()。 } } } クラスプロデューサーRunnableを{実装 リソース教材Rと、 プロデューサ(リソース教材のR){ this.r = R。 } @Override 公共ボイドラン(){ 一方(TRUE){ r.put( "烤鸭")。 } } } クラスの消費者は、Runnableを実装{ リソース教材Rと、 消費者(リソース教材のR){ this.r = R。 } @Override 公共ボイドラン(){ 一方(真) r.take(); } } publicクラスメイン{ 公共の静的な無効メイン(文字列[]引数)は例外{スロー スキャナスキャナ=新しいスキャナ(新しいにBufferedInputStream(System.in))を、 PrintWriterのうち=新しいPrintWriter(新しいのOutputStreamWriter(のSystem.out)); リソース教材のR =新しいリソース教材()。 プロデューサA =新たなプロデューサ(R) プロデューサB =新プロデューサ(R) 消費者C =新しい消費者(R) 消費者D =新しいコンシューマー(R); スレッドT1 =新しいスレッド(A)。 スレッドT2 =新しいスレッド(B)。 スレッドT3 =新しいスレッド(C); スレッドT4 =新しいスレッド(D); t1.start(); t2.start(); t3.start(); t4.start(); } }