2012-11-14 19 views
1

我想使用Java fork連接來解決遞歸問題,但我不想爲每個遞歸步驟顯式創建新的任務實例。原因是太多的任務等於太多的物體,經過幾分鐘的處理後會填滿我的記憶。在Java 7中重複使用fork/join中的任務對象

我在Java 6中有以下解決方案,但是Java 7有更好的實現嗎?

final static AtomicInteger max = new AtomicInteger(10); // max parallel tasks 
final static ThreadPoolExecutor executor = new ThreadPoolExecutor(....); 

private void submitNewTask() { 
    if (max.decrementAndGet()>=0) { 
     executor.execute(new Task(....)); 
     return; 
    } 
    run(); // avoid creating a new object 
} 

public void run() { 
    ..... process .... 
    // do the recursion by calling submitNewTask() 
    max.incrementAndGet(); 
} 

我想是這樣再次呼籲同一個任務的invoke()功能(更新過程中的相關領域,後),但它似乎並沒有工作。

+0

你在做什麼與Fork/Join有關?遞歸分解的整個想法是將大數組分成更小的部分,這樣每部分都可以在不同的處理器上運行。這些作品被稱爲任務。這裏我們需要更多的信息。 – edharned

回答

0

我認爲你沒有使用正確的方法。 Fork/Join框架旨在對一組(可能)較大的數據執行長時間運行算法,將並行方式分割成更小的部分(RecursiveTask本身),而不是可以由更多線程執行(加快多個執行「cpu」機器)使用工作竊取策略。

A RecursiveTask不需要複製所有的數據,只是爲了保持索引在你正在工作的部分(以避免有害的重疊),所以數據開銷保持在最低限度(當然,每個RecursiveTask也會消耗內存)。在算法設計中,內存佔用和執行時間之間經常有線程關聯,所以FJ框架旨在減少執行時間(我認爲很少)的內存佔用。如果執行時間不是您首先關心的問題,我認爲FJ對您的問題毫無用處。