java并行化问题 - 并行化与序列化一样慢

时间:2011-07-05 14:35:03

标签: concurrency threadpool parallel-processing

我一直在开发个人基础模型。所有你需要知道的是个人出生,繁殖和死亡。我有一个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

1 个答案:

答案 0 :(得分:0)

虽然不太熟悉Java的Executors类,但串行行为似乎表明您的线程池正在运行同一处理器上的所有线程。也许它与JVM如何处理线程有关?无论如何,看看你是否可以用Java创建单独的进程,看看是否有所作为。