2011-07-05 45 views
0

我一直在開發一個單獨的基礎模型。所有你需要知道的是個體出生,繁殖和死亡。我有一個GUI,我可以看到這些過程正在發生。java並行化問題 - 並行化和串行化一樣慢

我有一個mac pro,有8個內核和16GB內存。

考慮到仿真必須重複幾次以獲得錯誤等,我以爲我可以運行主類,然後單獨模擬(所有運行在同一程序)運行在不同的核心上。簡單。每個並行仿真都不知道其他仿真,因此不需要同步塊。

當主要方法運行時,它調用主類的構造函數 - 創建其他對象並開始模擬。因此 - 爲了平行 - 我創建了一個固定的線程池,它們將分別調用主類構造函數和多個(好的,8,核心數)仿真。

但是 - 它運行速度慢,就像我在串行模擬運行一樣。每個模擬的GUI中的動畫按順序更新,而不是同時更新。實際上,如果我從命令行同時運行8次程序(並且在'&'的背景中放置),它會更快,行爲更像我所希望的。這是令人討厭的!

在模擬開始時,會執行一些IO操作以讀取有關個人的數據,但只能在開始時讀取。

有趣的是,「並行」進程創建的第一個對象是在相同的內存地址創建的 - 但我認爲這不是問題。

如果有人對java併發工具的性能缺乏有所瞭解,那麼爲什麼程序似乎是以串行方式運行的,爲什麼簡單地從命令行運行8次主要方法比試圖並行化要好是最有幫助的。

因爲坦率地說,我對Java的並行處理能力失去了信心。

乾杯

詹姆斯

 noOfProcessors = (byte)Runtime.getRuntime().availableProcessors(); 
     ExecutorService eservice = Executors.newFixedThreadPool(noOfProcessors); 

     List<Future> futuresList = new ArrayList<Future>(); 

     for(int i = 0; i < noOfProcessors; i++){ 
      futuresList.add(eservice.submit(new simulation())); 

     }//end for 

     for(Future future : futuresList){ 

      try{ 

       future.get(); 

      }catch(InterruptedException ex){ 
       Logger.getLogger(simPanel.class.getName()).log(Level.SEVERE, null, ex); 
       System.exit(1); 
      }catch(ExecutionException ex){ 
       Logger.getLogger(simPanel.class.getName()).log(Level.SEVERE, null, ex); 
       System.exit(1); 
      }//end try-catch 

     }//end for loop 
+0

我能想到的唯一的其他事情就是爲每個線程分配內存 - 我指定了最小和最大堆大小,但也許這還不夠 - 可能每個線程的有限內存都是瓶頸系統? –

+0

您提到的GUI中的某些內容可能導致同步嗎?即整個模擬在Swing事件調度線程中運行還是奇怪的?你可以禁用你的應用程序的GUI部分來排除? – overthink

回答

0

雖然不是太熟悉Java的Executors類,串行的行爲似乎表明,你的線程池正在運行在同一處理器上的所有線程。也許這與JVM如何處理線程有關?無論如何,看看你是否可以在Java中創建單獨的進程,並看看是否有所作爲。