2013-12-13 33 views
0

我有一組問題把生產者/消費者問題..是否可以在同一時間使用線程使用者/生產者?

  1. 是有可能使在同一時間一個線程消費者和生產者?

  2. 在線程之間發送/接收數據的最佳塊隊列類型是什麼?

  3. 是否可以限制線程之間的傳輸以設置線程實例?如何 ?

謝謝。

對於問題否1.我認爲BlockingDeque是解決方案。 這是一些解釋:http://tutorials.jenkov.com/java-util-concurrent/blockingdeque.html

+0

這種併發模式有時被稱爲「工作列表」。例如,通過遞歸探索目錄搜索文件中的特定字符串可以實現爲保持併發結構(工作列表)以容納目錄這仍然需要探索。每個工作者線程從列表中取出一個項目,用它做一些事情,並且可能將childeren目錄放回到工作列表中,以便由其自己或另一個工作線程處理。 – Xantix

回答

4
  1. 是的。通常,如果一個線程既是消費者又是生產者,它會消耗與生產不同的「產品」,但它也可以消費自己的產品。

  2. 取決於消息的特徵和傳輸速率。但通常收益可以忽略不計。

  3. 是的 - 只是將隊列傳遞給相關方。

+0

對於問題3:如果一個實例需要兩個隊列路徑..一個來自隊列1,另一個來自隊列2,就像路由器..在子網之間.. – user1261494

+0

我認爲「Exchanger」將在我的情況下用於創建一個路由器。這裏是一個例子:http://tutorials.jenkov.com/java-util-concurrent/exchanger.html – user1261494

2

爲了增加阿列克謝的回答是:

  1. 雖然這是可能的,請注意,這樣的線程將不得不拆分它的消費國和生產活動之間的CPU時間,因此他們不能同時運行。但是它是完全可行的,例如,如果你的線程接受了一些數據(從它的消費者端隊列中取得它),以某種方式快速轉換並將其卸載到下一個隊列中;

  2. 儘管LinkedBlockingQueue最大限度地減少了生產者方的阻塞,但如果消費者的工作速度比生產者慢得多(例如,消費者對生產者的輸入進行一些長時間運算),它的使用可能導致內存耗盡。所以,你可能想要ArrayBlockingQueue,這是有界的,因此,不會導致OutOfMemory錯誤。