2015-10-14 60 views
1

我想實現等待共享資源的隊列。當這個資源是免費的時候,隊列會獲取第一個添加的元素並且改變這個資源中的信息。但是,如果沒有,就等着。併發庫中是否有可以執行此操作的隊列?或者我需要寫我自己的隊列?還是有更好的方法來做到這一點? 感謝您的幫助)隊列,等到事情發生時

+0

[BlockingQueue](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html)是你的朋友。 –

+0

A ['CompletionService'](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionService.html)可能是'BlockingQueue'的一個有用的替代方案,具體取決於生產者和消費者真的在做。 – erickson

回答

1

這聽起來像你想要兩件事。

  1. 一個BlockingQueue實例(如ArrayBlockingQueue)爲您的任務隊列來對資源進行。

  2. 線程等待資源可用時資源的鎖定。然後

你的線程可以採取一個項目從隊列並等待資源的鎖,或等待的資源鎖,然後嘗試按住該鎖採取一個項目從隊列中。

等待並從隊列中取第一個是比較容易設計,但你的問題的措辭使得它看起來就像你希望做相反的,等待的資源鎖,然後再嘗試從隊列中取。該工作流稍微複雜一點,你應該從隊列中取出poll()(而不是take()'ing),並釋放資源鎖定,如果隊列爲空時不想保留它。

E.g.

  1. 資源鎖
  2. 稍候...獲取資源鎖
  3. poll從隊列
  4. 如果隊列是空的,釋放資源鎖。
  5. 如果隊列不爲空,則處理隊列項目。
  6. 釋放資源鎖定。
  7. 如果隊列是空的,睡一會兒..?
  8. 重複。
+0

BlockingQueue提供解決第2點的['take'](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html#take--)方法。 –

+0

@ LuiggiMendoza我知道'take'方法,特別是因爲它主要是有'BlockingQueue'的原因,但這個問題的措辭似乎表明有另一個資源(與隊列分開)需要等待(例如網絡連接等)。我可能是錯的,這個問題措辭不是特別好,但這是我的假設,我的答案是基於什麼。例如。需要發送到網絡連接的項目隊列,也可能正在被其他線程使用。 –

+0

噢,對不起。您說得對,我需要更具體的解釋情況。有不同的應用程序和一個共享資源。每個應用程序都可以更改資源中的信息。我的任務是:我需要實現另一個應用程序,它讀取和寫入(更改)資源。所有信息在運行時都會更改,我需要將其存儲在隊列中。 當資源空閒時,我的應用程序從隊列中獲取信息並更改資源中的信息。 – Sheb