我一直在开发个人基础模型。所有你需要知道的是个人出生,繁殖和死亡。我有一个GUI,我可以看到这些过程发生。
我有一个mac pro,有8个内核和16GB内存。
考虑到模拟将不得不重复几次以获得错误条等,我认为我可以运行主类,然后在单独的核上运行单独的模拟(所有运行来自同一程序)。简单。每个并行仿真都不了解其他仿真,因此不需要同步块。
当运行main方法时,它会调用主类的构造函数 - 它会创建其他对象并开始模拟。因此 - 为了并行化 - 我创建了一个固定的线程池,它将分别调用主类构造函数和多个(好的,8个,核心数)模拟。
但是 - 它的运行速度和我在串行运行模拟一样慢。每个模拟的GUI中的动画按顺序更新,而不是同时更新。
事实上,如果我从命令行同时运行程序8次(并在后台放置'&'),它会更快,行为更像我希望的那样。这很烦人!
在模拟开始时,会执行一些IO操作来读取有关个人的数据,但仅限于开始。
有趣的是,“并行”进程创建的第一个对象是在相同的内存地址上创建的 - 但我不认为这是一个问题。
如果有人对java并发工具的性能缺乏有任何了解,那么为什么程序似乎是串行运行的呢?为什么简单地从命令行运行main方法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)
虽然不太熟悉Java的Executors类,但串行行为似乎表明您的线程池正在运行同一处理器上的所有线程。也许它与JVM如何处理线程有关?无论如何,看看你是否可以用Java创建单独的进程,看看是否有所作为。