2013-10-20 80 views
0

我在寫一個多線程Java程序,它模擬game of life。每個單元有一個線程計算細胞活性值的下一個值。我解決了95%的問題線程正常工作和同步,但我無法弄清楚如何在每一步之後打印出單元格矩陣。我在我的線程以下運行方法:並行線程執行一個循環後的打印輸出

public void run(){ 
    while(true){ //this may also be finite 
    calculateNeighbourCount(); //threads count their alive neighbours 
    calculateBarrier(); //Threads wait until all threads complete calculation before changing content 
    next();//threads make cell's value the next computed value. 
    nextBarrier(); //Threads wait until all threads complete next() 
    //Here I want to print out cell matrix 
    } 
} 

一個可能的解決方案,我能想到的是分配內存考慮iterations.For例子的數量,如果我有MXN細胞基質和K的迭代次數,我需要mxnxk 3D陣列。然後我在這個數組中存儲具有適當索引的輸出並在執行後輸出。但由於內存使用情況,此解決方案看起來非常糟糕。當所有單元格一起更改時,我需要一個解決方法來打印矩陣的快照。

+0

那麼你說的矩陣共享是否屬於所有線程?你是否試圖用[線程安全](http://arashmd.blogspot.com/2013/06/java-threading.html#synctr)的方式展示它? – 2013-10-20 11:45:49

回答

1

從Java文檔:

一個的CyclicBarrier支持運行一次 每個屏障點可選的Runnable命令,在黨內的最後一個線程到達之後,卻 任何線程之前被釋放。在任何一方繼續之前,此屏障措施對於更新共享狀態 非常有用。

您可以在文檔here中看到一個示例,但通常其中一個構造函數接受Runnable。您可以使用它在每個週期後進行打印。

+0

我正在使用此自定義屏障http://stackoverflow.com/questions/6331301/implementing-an-n-process-barrier-using-semaphores – woryzower