如何让循环并排运行?

时间:2008-11-08 06:45:56

标签: java loops

我一直在做一个幼稚的小程序:屏幕上有一堆不同颜色和大小的小圆圈。当较大的圆圈遇到较小的圆圈时,它会吃掉较小的圆圈,当圆圈吃掉足够的其他圆圈时,它会再现。它有点整洁!

然而,我实施它的方式,检测附近的圆圈并检查它们的可食性的过程是通过循环遍历整个圆圈的人群来完成的......随着人口的变化,这需要更长更长的时间在它开始下降之前飙升到3000。这个过程不会让我的电脑慢下来,我可以去玩Dawn of War或其他什么并且没有任何减速:它只是检查每个圆圈以查看它是否与其他所有圆相撞的过程。

所以我想到的是,我可以尝试将应用程序窗口分成四个象限,并让象限中的圆圈同时进行检查,因为它们几乎没有机会相互干扰:或者某事为此!

我的问题是:如何制作并排运行的循环?在Java中,比如说。

7 个答案:

答案 0 :(得分:9)

你在这里遇到的问题实际上可以在没有线程的情况下解决。

您需要的是空间数据结构。四边形树是最好的,或者如果球体移动的场是固定的(我假设它是),你可以使用一个简单的网格。继承人的想法。

将显示区域划分为正方形网格,其中每个单元格至少与最大圆圈一样大。对于每个单元格,保留其中心位于该单元格中的所有圆的列表(链表最佳)。然后在碰撞检测步骤中,遍历每个单元格,检查该单元格中的每个圆圈与该单元格中的所有其他圆圈以及周围的单元格。

从技术上讲,您不必检查每个单元格周围的所有单元格,因为其中一些单元格可能已被检查过。

您可以将此技术与多线程技术相结合,以获得更好的性能。

答案 1 :(得分:8)

计算机通常是单一任务的,这意味着它们通常可以按CPU或核心一次执行一条指令。

但是,正如您所注意到的,您的操作系统(和其他程序)似乎同时运行许多任务。

这是通过将工作分成进程来完成的,每个进程可以通过生成线程来进一步实现并发。然后,操作系统很快地在每个进程和线程之间切换,以产生多任务处理的错觉。

在您的情况下,您的java程序是一个单独的进程,您需要创建4个线程,每个线程运行自己的循环。它可能会变得棘手,因为线程需要同步它们对局部变量的访问,以防止一个线程在另一个线程试图访问它时编辑变量。

因为线程是一个复杂的主题,它需要比我在这里做的更多的解释。

但是,您可以阅读Suns关于并发的优秀教程,其中涵盖了您需要了解的所有内容:

http://java.sun.com/docs/books/tutorial/essential/concurrency/

答案 2 :(得分:5)

你所寻找的并不是让它们同时运行的方式(正如人们所说,这取决于你拥有多少核心,并且只能提供2倍或4倍的加速),而是以某种方式切割减少必须检测的碰撞次数。

您应该考虑使用quadtree。简而言之,您递归地将2D区域分解为四个象限(根据需要),然后只需要检测附近组件中对象之间的碰撞。在良好的情况下,它可以有效地将您的碰撞检测时间从N ^ 2减少到N * log N.

答案 3 :(得分:1)

您可能希望寻找碰撞检测优化,而不是尝试进行并行处理。因为在许多情况下,在一个线程中执行较少的计算比在多个线程之间分配计算更好,而且在这个多线程业务中很容易让自己陷入困境。尝试谷歌搜索“碰撞检测算法”,看看它在哪里;)

答案 4 :(得分:0)

如果您的计算机有多个处理器或多个核心,那么您可以轻松地运行多个线程并在每个线程中运行较小的循环部分。如今,许多PC都有多个核心 - 所以要让每个线程获得循环次数的1 / n,然后创建n个线程。

答案 5 :(得分:0)

如果你真的想进入并发编程,你需要学习如何使用线程。

Sun有一个编写Java线程的教程: http://java.sun.com/docs/books/tutorial/essential/concurrency/

答案 6 :(得分:0)

这听起来与我的实验非常相似 - 检查出来......

http://tinyurl.com/3fn8w8

我也对四叉树感兴趣(这就是为什么我在这里)...希望你能想到这一切。