2009-01-16 59 views
1

我想出了一個基於任務的多線程java 1.5系統的設計。併發機制中的java設計任務

任務通常會與集合進行交互以確定失敗或成功的匹配事件。根據結果​​,另一項任務可能會排隊進行IO交易,以通知客戶和/或存儲有關交易的重要信息。

Java爲線程池和任務管理提供了一套豐富的併發工具,但我試圖爲任務本身提出最佳設計。

例如:每個任務是否應該引用集合?應該如何初始化任務? etc ...

是否有人知道優秀的編碼示例或任何參考,說明了一些不同的設計可能性。

+0

這個問題對我來說有點含糊。也許試圖提高你正在嘗試做什麼的描述? – krosenvold 2009-01-16 19:17:36

回答

3

任何試圖在Java中執行多線程的人都應閱讀Brian Goetz的"Java Concurrency In Practice"

您不應該嘗試使用低於版本5的任何JDK。這就是java.util.concurrent包首次出現時的情況。

+0

他說他已經在Java 1.5上了,我認爲「線程池和任務管理的豐富併發工具集」可能指的是java.util.concurrent。但這本書絕對是一個有效的觀點。 – 2009-01-16 22:15:15

0

一個可行的策略是爲每個任務引用共享的線程安全的集合。這很有效,但是對於你如何使用集合(最重要的是你是否在修改它)和預期的併發性有一些明顯的限制。如果您需要從任務中修改集合,則會在共享集合上產生某種級別的寫入爭用。取決於線程的數量,哪個集合(線程安全與併發)等,這可能是一個瓶頸。即使讀取可能會導致某些集合類型的爭用。

另一種選擇是給每個任務所需的輸入,讓它計算結果,然後後處理結果。這可以並行或不併行完成,具體取決於您的需求。

在任何情況下,您都應該使用ExecutorService,因爲它可以讓您組合一個線程池和一個請求隊列,其中線程將根據需要提取和執行任務。如果有用,CompletionService也可以添加結果隊列。