2013-07-13 36 views
1

關於在java中使用線程的問題(免責聲明 - 我對線程不太熟悉,所以請允許一些餘地)。多個線程按順序提交動作

概述: 我想知道是否有多線程添加要執行的操作到另一個線程會照顧的隊列的方式。真正的順序並不重要 - 更重要的是隊列中的動作一次只處理一個。

說明: 我打算託管一個小型服務器(使用servlet)。我希望每個到客戶端的連接都由一個單獨的線程來處理(到目前爲止)。但是,這些線程/客戶端中的每一個都將對單個xml文件進行更改。但是,這些更改不能同時完成。

問題: 我可以讓每個線程將更改提交給另一個線程將持續管理的隊列嗎?正如我所說,這些變化的順序並不重要,只是它們不會同時發生。

此外,請告知如果這不是最好的辦法做到這一點。

非常感謝。

+1

對於您的場景,由於Servlet已經是多線程的(對於每個請求,創建一個單獨的線程並處理請求)。所以你可以創建一個簡單的類來處理XML操作,並在其中放入一些同步方法來檢索或保存數據。 – Dreamer

+0

你只需要使'synchronized'[方法改變](http://www.codeproject.com/Articles/616109/Java-Thread-Tutorial#syncmethod)xml – 2013-07-14 06:58:06

回答

4

這是一個合理的方法。使用無界的BlockingQueue(例如LinkedBlockingQueue) - 在XML文件上執行IO的線程在隊列上調用take以刪除下一條消息(如果隊列爲空則阻塞),然後處理消息以修改XML文件,同時提交線程對XML文件的更改將在隊列上調用offer以將其消息添加到隊列中。 BlockingQueue是線程安全的,因此您的線程無需對其執行同步。

+1

單線程執行程序做的是完全一樣的東西,你有描述如此我馬特的+1。 – Vipin

1

您可以讓線程將任務提交給只有一個線程的ExecutorService。或者你可以有一個只允許一個線程立即修改文件的鎖。後者似乎更自然,因爲該文件是共享資源。隊列是等待鎖的線程的隱含隊列。

1

Executor接口提供你所需要的抽象:

執行已提交Runnable任務的對象。該接口提供從如何每個任務將要運行的機制,包括線程使用,調度等細節解耦任務提交的方法相關的Executor正常使用明確創建線程,而不是「。

單-threaded執行服務似乎正是這個職位的合適的工具見Executors.newSingleThreadExecutor(),它的javadoc說:。​​

創建一個使用單個worker線程的 無界隊列操作Executor但是(請注意,如果此單由於執行期間失敗,線程終止 p如果需要執行後續任務,將會有一個新的 代替它。)任務是 保證按順序執行,並且在任何給定時間不會有超過一個任務爲 活動。與其他等效的 newFixedThreadPool(1)不同,返回的執行器保證不被 重新配置爲使用額外的線程。

請注意,在JavaEE上下文中,您需要考慮在卸載web應用程序時如何終止工作線程。有other questions here on SO處理這個。