Java 如何使循环并排运行?

Java 如何使循环并排运行?,java,loops,Java,Loops,我一直在做一个幼稚的小程序:屏幕上有一堆不同颜色和大小的小圆圈。当一个较大的圆遇到一个较小的圆时,它会吃掉较小的圆,当一个圆吃掉了足够多的其他圆时,它会复制。有点整洁 然而,按照我的实现方式,检测附近的圆圈并检查它们的可食性的过程是通过一个for循环完成的,该循环在整个活着的圆圈中循环。。。这需要越来越长的时间,因为人口倾向于在开始下降之前达到3000人。这个过程不会让我的电脑慢下来,我可以去玩《战争黎明》或其他任何游戏,但没有任何慢下来:它只是检查每个圆圈,看看它是否与其他圆圈发生碰撞的过程

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

然而,按照我的实现方式,检测附近的圆圈并检查它们的可食性的过程是通过一个for循环完成的,该循环在整个活着的圆圈中循环。。。这需要越来越长的时间,因为人口倾向于在开始下降之前达到3000人。这个过程不会让我的电脑慢下来,我可以去玩《战争黎明》或其他任何游戏,但没有任何慢下来:它只是检查每个圆圈,看看它是否与其他圆圈发生碰撞的过程

因此,我想到的是,我可以尝试将应用程序窗口分为四个象限,让象限中的圆圈同时进行检查,因为它们几乎不可能相互干扰:或者类似的事情


那么,我的问题是:如何创建并排运行的循环?例如,在Java中。

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

计算机通常是单任务的,这意味着它们通常可以在每个CPU或内核上一次执行一条指令

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

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

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

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

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


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

Sun在此处提供了Java线程编程教程:

您所寻找的不是让这些设备同时运行的方法(正如人们所指出的,这取决于您有多少内核,并且只能提供2倍或4倍的加速),而是以某种方式减少您必须检测的碰撞次数


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

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

您需要的是一个空间数据结构。四叉树最好,或者如果球体移动的区域是固定的(我假设是固定的),您可以使用简单的网格。想法是这样的

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

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


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

与其尝试进行并行处理,不如寻求冲突检测优化。因为在许多情况下,在一个线程中执行较少的计算要比在多个线程之间分配计算好,而且在这个多线程业务中很容易让自己一败涂地。试试谷歌搜索“碰撞检测算法”,看看它能帮你什么忙;)

这听起来很像我的一个实验——看看吧


我也对四叉树感兴趣(这就是我来这里的原因)。。。希望你能解决所有问题。

请记住,如果你更改circles程序,使其使用CPU上的所有内核,可能会开始影响战争的曙光。小心你的愿望:-)这些圆圈在移动吗?随机?我想在我提出建议之前,你需要说一点。只要知道这叫什么,这个“线程”,就足够让我开始学习更多关于它的信息:谢谢!通常情况下,不知道某事物的单词是能够了解它和不了解它之间的障碍。哇!线程在我的能力范围之外:我阅读了该教程,并将尝试用线程编写一些我自己的东西,但我想我还需要一段时间才能使用它们来加速碰撞检测。谢谢当然可以。起初我让每个球互相检查,这意味着有些球在检查已经被吃掉的球!我修好了,它帮了很多忙。我一定会用谷歌搜索你所说的“碰撞检测算法”!