2016-12-29 157 views
2

根據GeeksforGeeks-ProducerConsumerProblem,我很困惑與第二運動:生產者 - 消費者產生一個項目,並立即進行消費(JAVA)

儘量讓你的程序產生一個項目,並立即之後,消費者在任何其他消耗它物品是由消費者製作的。

如何解決? 我覺得在生產者生產一個項目後,我們可以在生產者向列表添加一個項目後記錄大小。 while(list.size()== recordSize)wait(); 這是正確的嗎? 謝謝你的時間。

回答

1

你可以使用一個標誌變量,並且每次你想產生一個你需要驗證這個標誌爲false的項目。 (如果您已經生成了一個項目,則該標誌爲True,因此除非知道該消費者已經處理該項目,否則您不能生成另一個項目,您應該使用同步來保護該標誌的值)。 現在,如果該標誌爲false,請添加一個項目,然後wait()或者wait()以供消費者使用,然後在消費者代碼中使用notify()繼續。您還應該在消費者代碼中使用wait()以等到生產者生產一件物品,然後在完成時使用notify()wait()等待新件。

+0

我認爲這正是他們想要的那樣練習 –

0

一想這個問題可以通過使用SynchronousQueue

您還可以閱讀更多關於它herehere

這是一個更好的選擇,然後使用自己的同步化構造來解決。

0

生產者可以爲消費者填寫Future。生產者然後調用Futureget()方法,這將導致生產者線程停止,直到消費者完成。這種解決方案本質上是現代的,因爲它是在野外完成的方式。使用CountDownLatch也可以做到這一點。閂鎖與未來之間的區別在於,當生產者需要生成Future對象的持有者所需的對象時,使用Future。而CountDownLatch主要用於同步多個線程。

雖然使FutureCountDOwnLatch工作在這個例子中需要一些變化的問題,例如LinkedList必須通過更多的不僅僅是一個Integer。更簡單的解決方案是將LinkedList換成SynchronousQueue。 A SynchronousQueue在其中包含零個元素,因此當某個項目插入到隊列中時,隊列會阻塞,直到消費者來到並接收項目。進一步嘗試put對象到SynchronousQueue將阻塞,直到該項目被消耗。生產者可以嘗試在生產者完成前一個項目之前將enxt項目放入隊列中,但是它會再次等待消費者前來獲取它。

+1

雖然它不會改變解決問題的任何事情,但是您對SynchronousQueue的描述與JavaDoc相矛盾 - 它沒有容量,所以即使是第一個「put」操作直到相應的「移除」到達時才完成。 – Deltharis

+0

@Deltharis正確,將調整我的句子來說明。謝謝 –