Java并行编程性能建议

Java并行编程性能建议,java,multithreading,Java,Multithreading,我正在使用java构建期权估价(二叉树)。我的二项式树有1000个步骤的正常序列代码,需要0.1秒。但当我尝试使用并行程序运行它时,大约需要65秒。如有任何建议和意见,将不胜感激 Binomial Thread is my class which does the calultion ThreadPoolExecutor threadExecutor = new ThreadPoolExecutor(10000, 10000, 500, TimeUnit.MILLISECONDS,

我正在使用java构建期权估价(二叉树)。我的二项式树有1000个步骤的正常序列代码,需要0.1秒。但当我尝试使用并行程序运行它时,大约需要65秒。如有任何建议和意见,将不胜感激

Binomial Thread is my class which does the calultion
ThreadPoolExecutor threadExecutor = new ThreadPoolExecutor(10000, 10000, 500,
       TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(10),
       new ThreadPoolExecutor.CallerRunsPolicy());

for (int i = 0; i < 10000; i++) {
Runnable thread = new BinomialThread();
threadExecutor.execute(thread);
}
二项式线程是我的类,它执行计算
ThreadPoolExecutor threadExecutor=新的ThreadPoolExecutor(10000,10000,500,
TimeUnit.ms,新的ArrayBlockingQueue(10),
新的ThreadPoolExecutor.CallerRunPolicy());
对于(int i=0;i<10000;i++){
Runnable thread=new BinomialThread();
线程执行器。执行(线程);
}

如果线程数大于处理器数,并且没有等待时间(例如等待网络数据、读取文件等),则性能会下降,而不是增加从一个进程切换到另一个进程所需的时间。
您有10.000个线程,这就是为什么您的程序在多线程环境中比在单线程环境中花费更多的时间。

对于N cpu处理器。最佳线程数应为N+1(在实践第8章中检查Java一致性)。一旦创建的线程超过这个数量(对于计算密集型任务),性能就会因为涉及到上下文切换而开始下降。这就解释了你得到的数字

要确定CPU的数量,请执行以下操作:

int N_CPUS = Runtime.getRuntime().availableProcessors();

然后,您应该将执行器配置为N+1个线程。

尝试使用2个线程,然后是5个线程,然后是10个线程,并检查计时方式。fork/join框架将解决此问题: