1

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

Line2D、Rectangle2D、Ellipse2D、QuadCurve2D 和 CubicCurve2D。

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

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

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

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

4

1 回答 1

1

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

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

第三,我建议确保您的线程同时结束,使用 CyclicBarrier 或 CountDownLatch 之类的东西,而不是自己在线程中等待。

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

于 2013-07-04T04:42:34.683 回答