为什么在使用线程池时看不到性能提升?

时间:2013-05-29 08:09:56

标签: java multithreading threadpool raytracing raycasting

我编写了一个2D雷达,可以将光线绘制到任何java形状,包括:

Line2D,Rectangle2D,Ellipse2D,QuadCurve2D和CubicCurve2D。

它背后的数学实际上非常复杂和密集,特别是对于四边形和立方体,所以我设置了一个线程池。 我根据可用内核的数量制作了一个具有固定线程数的ExcecutionService“exec”。

然后我将负责每个形状的代码块更改为静态runnables。 从raycaster方法,我执行runnables然后调用exec.shutdown()。 最后,id创建一个while循环,直到exec.isTerminated返回true才会退出。

这确保所有线程在继续之前完成执行。

现在,从我在网上看到的,这是一种流行的方式,但我没有看到改善的结果。 如果不是更糟,它总是一样的。 有没有一种正确的方法来使用实际上提高效率而不是匹配的线程池会增加开销?

1 个答案:

答案 0 :(得分:1)

正如@Adam Siemion所说,首先确保您的PC不受CPU的限制,并且您确实拥有多核CPU。否则你无论如何都不能更快。

其次,不要动态创建线程。使用带有任务队列的线程池(请参阅java.util.concurrent中的ExecutorService等)。如果你经常为大量的小任务创建线程,那么创建和清理线程会占用相当多的时间。

第三,我建议确保你的线程同时结束,使用像CyclicBarrier或CountDownLatch这样的东西,而不是在你自己的线程内等待。

如果上述问题无法解决您的问题,请在此处发布一些代码。另一个猜测是你有一些共享的资源串行依赖,例如画线等。