根據GeeksforGeeks-ProducerConsumerProblem,我很困惑與第二運動:生產者 - 消費者產生一個項目,並立即進行消費(JAVA)
儘量讓你的程序產生一個項目,並立即之後,消費者在任何其他消耗它物品是由消費者製作的。
如何解決? 我覺得在生產者生產一個項目後,我們可以在生產者向列表添加一個項目後記錄大小。 while(list.size()== recordSize)wait(); 這是正確的嗎? 謝謝你的時間。
根據GeeksforGeeks-ProducerConsumerProblem,我很困惑與第二運動:生產者 - 消費者產生一個項目,並立即進行消費(JAVA)
儘量讓你的程序產生一個項目,並立即之後,消費者在任何其他消耗它物品是由消費者製作的。
如何解決? 我覺得在生產者生產一個項目後,我們可以在生產者向列表添加一個項目後記錄大小。 while(list.size()== recordSize)wait(); 這是正確的嗎? 謝謝你的時間。
你可以使用一個標誌變量,並且每次你想產生一個你需要驗證這個標誌爲false的項目。 (如果您已經生成了一個項目,則該標誌爲True,因此除非知道該消費者已經處理該項目,否則您不能生成另一個項目,您應該使用同步來保護該標誌的值)。 現在,如果該標誌爲false,請添加一個項目,然後wait()
或者wait()
以供消費者使用,然後在消費者代碼中使用notify()
繼續。您還應該在消費者代碼中使用wait()
以等到生產者生產一件物品,然後在完成時使用notify()
和wait()
等待新件。
生產者可以爲消費者填寫Future。生產者然後調用Future
的get()
方法,這將導致生產者線程停止,直到消費者完成。這種解決方案本質上是現代的,因爲它是在野外完成的方式。使用CountDownLatch也可以做到這一點。閂鎖與未來之間的區別在於,當生產者需要生成Future
對象的持有者所需的對象時,使用Future。而CountDownLatch
主要用於同步多個線程。
雖然使Future
或CountDOwnLatch
工作在這個例子中需要一些變化的問題,例如LinkedList
必須通過更多的不僅僅是一個Integer
。更簡單的解決方案是將LinkedList
換成SynchronousQueue。 A SynchronousQueue
在其中包含零個元素,因此當某個項目插入到隊列中時,隊列會阻塞,直到消費者來到並接收項目。進一步嘗試put
對象到SynchronousQueue
將阻塞,直到該項目被消耗。生產者可以嘗試在生產者完成前一個項目之前將enxt項目放入隊列中,但是它會再次等待消費者前來獲取它。
雖然它不會改變解決問題的任何事情,但是您對SynchronousQueue的描述與JavaDoc相矛盾 - 它沒有容量,所以即使是第一個「put」操作直到相應的「移除」到達時才完成。 – Deltharis
@Deltharis正確,將調整我的句子來說明。謝謝 –
我認爲這正是他們想要的那樣練習 –