2011-02-06 88 views
14

我的問題是,是否存在用於管理和併發運行具有邏輯相關性的任務的Java框架。我的任務如下: 我有很多獨立的任務(比如說A,B,C,D ...),它們被實現爲命令(就像命令模式一樣)。我希望有一種執行者可以接受所有這些任務並且以並行的方式執行它們。 任務可以相互依賴(例如,我不能運行C,在我運行A之前),同步或異步。用於管理任務的Java框架

我還想加入自定義的啓發式方法來影響調度程序的執行,例如,如果任務A和B是CPU密集型的,而C是高內存消耗,那麼運行A和C是有意義的並行,而不是運行A和B.

在我潛心於構建這個東西之前(我正在考慮java.util.concurrent +基於註解的約束/規則),我想知道,如果有人能指向我一些可以滿足我需求的項目。 非常感謝

+0

看看Fork/Join? – 2011-02-06 12:32:25

+0

我不知道任務是否重複使用其他結果。如果他們是具有預定序列的獨立工作單元,那麼可以通過非常簡單的自定義線程池執行器來解決調度和自定義啓發式問題。 – 2011-02-07 01:32:41

回答

7

我不認爲有一個管理任務可以滿足您的要求的框架。您正在使用Command模式的正確路徑。您可以查看Akka framework以獲得簡化的併發模型。阿卡是基於Actor模型:

的角色模型是另一種非常簡單 高水平併發模型:演員 不能在同一時間超過一個消息 響應(消息排隊到 郵箱)並且只能通過 發送消息進行通信,而不能共享 變量。只要消息 不可變的數據結構(這是 總是在二郎山真實的,但必須是在語言 約定不保證該物業 手段),一切 是線程安全的,而不需要任何 其他機制。這是非常類似的 要求在web 開發MVC框架中找到週期。 http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka是用Scala編寫的,但它暴露了乾淨的Java API。

2

我建議你考慮使用ant來達到這個目的的可能性。雖然ant被稱爲流行的構建工具,但它實際上是運行各種任務的XML控制引擎。我認爲它的標誌fork=true完全符合你的需求:同時運行任務。由於任何Java應用程序ant可以從其他Java應用程序執行:只需調用它的main方法即可。在這種情況下,您可以使用ant API封裝您的任務,即將它們實施爲Ant任務。

我從來沒有嘗試過這種方法,但我相信它應該可以工作。我幾年前曾經考慮過這個問題,並建議我的管理層將其作爲類似於您的問題的可能解決方案。

0

有一個框架,專門爲此呼籲dexecutor(聲明:我是老闆)

Dexecutor是一種重量很輕的框架,以可靠的方式來執行依賴/獨立的任務,要做到這一點,提供了最小的API。

  • 一個API來在圖形添加節點(addDependency,addIndependent,addAsDependentOnAllLeafNodes,addAsDependencyToAllInitialNodes後來兩個是前兩個混合版本)
  • 和其他爲了執行的節點。

這是最簡單的例子:

DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor(); 

    executor.addDependency(1, 2); 
    executor.addDependency(1, 2); 
    executor.addDependency(1, 3); 
    executor.addDependency(3, 4); 
    executor.addDependency(3, 5); 
    executor.addDependency(3, 6); 
    //executor.addDependency(10, 2); // cycle 
    executor.addDependency(2, 7); 
    executor.addDependency(2, 9); 
    executor.addDependency(2, 8); 
    executor.addDependency(9, 10); 
    executor.addDependency(12, 13); 
    executor.addDependency(13, 4); 
    executor.addDependency(13, 14); 
    executor.addIndependent(11); 


    executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING); 

這裏如何依賴圖將被修建在 enter image description here

任務1,12,11將並行在這些任務運行時,一旦完成依賴任務將運行,例如,假設任務1完成,任務2和3將以類似方式運行一次任務12,完成任務13將運行等等。