Concurrency java并行化问题-并行化和串行化一样慢

Concurrency java并行化问题-并行化和串行化一样慢,concurrency,threadpool,parallel-processing,Concurrency,Threadpool,Parallel Processing,我一直在开发一个单独的基础模型。你所需要知道的是,个体是出生、繁殖和死亡的。我有一个GUI,可以在其中看到这些过程的发生 我有一个mac pro,有8个内核和16GB内存 考虑到模拟必须重复几次才能得到错误条等,我想我可以运行main类,然后在单独的内核上运行单独的模拟(所有模拟都从同一个程序运行)。简单。每个并行模拟都不知道其他模拟,因此不需要同步块 当main方法运行时,它调用main类的构造函数,该构造函数创建其他对象并开始模拟。因此,为了并行化,我创建了一个固定的线程池,它将分别调用主类

我一直在开发一个单独的基础模型。你所需要知道的是,个体是出生、繁殖和死亡的。我有一个GUI,可以在其中看到这些过程的发生

我有一个mac pro,有8个内核和16GB内存

考虑到模拟必须重复几次才能得到错误条等,我想我可以运行main类,然后在单独的内核上运行单独的模拟(所有模拟都从同一个程序运行)。简单。每个并行模拟都不知道其他模拟,因此不需要同步块

当main方法运行时,它调用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
noOfProcessors=(字节)Runtime.getRuntime().availableProcessors();
ExecutorService eservice=Executors.newFixedThreadPool(noOfProcessors);
List futuresList=new ArrayList();
for(int i=0;i
虽然不太熟悉Java的Executors类,但串行行为似乎表明线程池正在同一处理器上运行所有线程。也许这与JVM如何处理线程有关?无论如何,看看您是否可以在Java中创建单独的进程,看看这是否会有所不同

我唯一能想到的另一件事是给每个线程分配内存-我确实指定了最小和最大堆大小,但这可能还不够-可能每个线程的内存有限限制了系统?您提到的GUI中有没有可能导致同步?i、 整个模拟是在Swing事件调度线程中运行还是有些奇怪?你能禁用应用程序的GUI部分来排除这种情况吗?