我想實現等待共享資源的隊列。當這個資源是免費的時候,隊列會獲取第一個添加的元素並且改變這個資源中的信息。但是,如果沒有,就等着。併發庫中是否有可以執行此操作的隊列?或者我需要寫我自己的隊列?還是有更好的方法來做到這一點? 感謝您的幫助)隊列,等到事情發生時
回答
這聽起來像你想要兩件事。
一個
BlockingQueue
實例(如ArrayBlockingQueue
)爲您的任務隊列來對資源進行。線程等待資源可用時資源的鎖定。然後
你的線程可以採取一個項目從隊列並等待資源的鎖,或等待的資源鎖,然後嘗試按住該鎖採取一個項目從隊列中。
等待並從隊列中取第一個是比較容易設計,但你的問題的措辭使得它看起來就像你希望做相反的,等待的資源鎖,然後再嘗試從隊列中取。該工作流稍微複雜一點,你應該從隊列中取出poll()
(而不是take()
'ing),並釋放資源鎖定,如果隊列爲空時不想保留它。
E.g.
- 資源鎖
- 稍候...獲取資源鎖
poll
從隊列- 如果隊列是空的,釋放資源鎖。
- 如果隊列不爲空,則處理隊列項目。
- 釋放資源鎖定。
- 如果隊列是空的,睡一會兒..?
- 重複。
BlockingQueue提供解決第2點的['take'](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html#take--)方法。 –
@ LuiggiMendoza我知道'take'方法,特別是因爲它主要是有'BlockingQueue'的原因,但這個問題的措辭似乎表明有另一個資源(與隊列分開)需要等待(例如網絡連接等)。我可能是錯的,這個問題措辭不是特別好,但這是我的假設,我的答案是基於什麼。例如。需要發送到網絡連接的項目隊列,也可能正在被其他線程使用。 –
噢,對不起。您說得對,我需要更具體的解釋情況。有不同的應用程序和一個共享資源。每個應用程序都可以更改資源中的信息。我的任務是:我需要實現另一個應用程序,它讀取和寫入(更改)資源。所有信息在運行時都會更改,我需要將其存儲在隊列中。 當資源空閒時,我的應用程序從隊列中獲取信息並更改資源中的信息。 – Sheb
- 1. 等到事件發生時
- 2. 等到事件發生時
- 3. XAML,MVVM和等待事情發生
- 4. 在等待隊列上放置進程時發生中斷
- 5. 如何告訴react-router等到發生了什麼事情?
- 6. 當從隊列中抽取隊列時發生Java'NoSuchElementException'
- 7. 排隊等候的事件數量? (Win32事件隊列)
- 8. 等待事件發生?
- 9. 添加到等待隊列
- 10. 從列表中每小時發生一件特別的事情
- 11. C#:將對象添加到隊列時觸發事件
- 12. 發生了什麼事情,並在此聲明平等嗎?
- 13. 等待發生的事情 - 異步或同步模型?
- 14. 隊列:: push()不發送隊列到IronMQ
- 15. NServiceBus事件超時隊列
- 16. 如果ExecutorService的隊列已滿,會發生什麼情況
- 17. 等待事情,但讓事情併發運行
- 18. 在App Engine隊列中,queue.yaml發生更改時現有任務會發生什麼情況?
- 19. 節點服務器拋出異常時事件隊列會發生什麼
- 20. 從java發送時,Skype消息在隊列中等待處理
- 21. PHP事件發生倒計時和事件發生時更新
- 22. 使用boost :: asio和strands的事件隊列:等待新事件
- 23. 發生病情時會發生什麼情況?
- 24. 詹金斯等待事件發生
- 25. 一個有趣的事情發生...... ExecutorCompletionService
- 26. 與NSDateFormatter發生奇怪的事情
- 27. 在android中按順序發生事情
- 28. 通知主叫類事情發生
- 29. 奇怪的事情發生HTML和JS
- 30. 意外的事情發生了
[BlockingQueue](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html)是你的朋友。 –
A ['CompletionService'](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionService.html)可能是'BlockingQueue'的一個有用的替代方案,具體取決於生產者和消費者真的在做。 – erickson