2016-12-29 17 views
2

GeeksforGeeks-ProducerConsumerProblemによると、私は2番目の運動で混乱しています:プロデューサー - 消費者が一つのアイテムを生産し、すぐに(Javaの)消費

は、あなたのプログラムが一つのアイテムを生成し、その直後に、消費者は、他の前にそれを消費させるようにしてください商品は消費者によって生産される。

どうすれば解決できますか? プロデューサーがアイテムを作成した後、プロデューサーがアイテムをリストに追加した後にサイズを記録することができます。そしてwhile(list.size()== recordSize)wait(); 正しいですか? ありがとうございます。

答えて

1

フラグ変数を使用して、このフラグがfalseであることを確認する必要があるアイテムを生成するたびに使用できます。 (消費者がそれを処理したことを知るまで別の商品を作ることができないようにアイテムをすでに作成している場合は、このフラグはTrueです。このフラグの値をsynchronizedで保護する必要があります)。 フラグがfalseの場合は、項目を追加してからwait()、それ以外の場合はwait()を消費して消費者コードにnotify()を使用してください。プロデューサがアイテムを生成するまで待ち、その後新しいアイテムを待つためにnotify()wait()を使用すると、コンシューマコード内でwait()を使用してアイテムを生成する必要があります。

+0

私はこれがまさにそのようなエクササイズで望むことができるものだと思います –

0

Aは、問題はあなたがまた、これはその後、自身のsyncronizationの構築物を用いて、より良い代替手段ですそれherehere

の詳細を読むことができSynchronousQueue

を使用することによって解決することができると思います。

0

プロデューサは、コンシューマ向けにFutureのままにすることができます。次に、プロデューサはFutureget()メソッドを呼び出し、プロデューサスレッドを消費者が終了するまで停止させます。このソリューションは、野生の中で行われる方法なので、現代的なものです。同じことはCountDownLatchを使用して行うことができます。ラッチと将来との違いは、プロデューサがFutureオブジェクトの所有者が必要とするオブジェクトを生成する必要がある場合にFutureが使用されることです。 CountDownLatchは、主に複数のスレッドの同期に使用されます。この例ではFutureCountDOwnLatch作業が問題にいくつかの変更が必要になり、例えばLinkedListがちょうどInteger以上に合格する必要がありますようにする

けれども。簡単な解決方法は、LinkedListSynchronousQueueに置き換えることです。 A SynchronousQueueにはゼロ要素が含まれているため、アイテムがキューに挿入されると、キューはコンシューマが来てアイテムを取得するまでブロックされます。オブジェクトをSynchronousQueueに追加しようとすると、そのアイテムが消費されるまでブロックされます。プロデューサは、プロデューサが前のキューで終了する前にキューにenxtアイテムを配置しようと試みることができますが、消費者が来てそれを取得するためにそこで再び待機します。

+1

問題を解決する上で何も変わらないが、SynchronousQueueの説明はJavaDocと矛盾している - それは容量がないので、対応する「削除」が到着するまで終了しない。 – Deltharis

+0

@Deltharis correct、私の文章にそれを述べるよう調整します。ありがとう –

関連する問題