【问题标题】:Java concurrency - marbles moving around a circleJava 并发 - 弹珠绕一圈移动
【发布时间】:2014-03-27 18:35:26
【问题描述】:

让我们想象一个简单的 Java 程序,其中有 5 个 2D 弹珠以固定的顺序绕着一个圆圈移动。您可以控制每个弹子的速度,记住较慢的弹子会阻止弹子移动得更快(它们无法超车)。他们都在一个方向上绕一圈。对此进行编程的最佳方法是什么?这个想法是为每个弹珠分配一个单独的线程,这实际上是要求之一。 然后我创建了五个线程,在所有线程共有的某个对象上同步“move”方法。下一步是检查我是否可以向前移动弹珠,如果有一些可用空间。所以在我搬家之前,我会检查是否有空闲空间,然后采取行动。在这里使用 wait() 和 notify() 机制是否有必要或至少是一个好主意? 感谢您的帮助。

【问题讨论】:

  • 也许您可以自己尝试一下,然后在您遇到无法解决的特定错误时返回这里提供一些实际代码。
  • 您会等待并通知什么?

标签: java concurrency


【解决方案1】:

好吧,我不打算为你的作业编写代码,但这里有一个高层次的介绍。

您需要每个弹珠定期更新其位置,因此需要某种类型的循环。这个循环通常被称为游戏循环。这是对它们的各种类型的讨论,从简单到复杂。 http://www.java-gaming.org/index.php?topic=24220.0 对于你的项目,简单的可能就足够了,但我不知道它的要求。

每次弹珠尝试移动时,它都必须检查以确保它没有被阻挡。如前所述,如果您同步了 move 方法,那么一次只能移动一个弹珠,这样可以避免并发问题。

除了在你的游戏循环中使用Thread.sleep,我看不出你有任何等待的理由。 Java 有一个synchronize 关键字,可用于锁定您提到的用于移动的共享对象,以避免并发问题。所以我不认为waitnotify 是必要的。

只是我的想法,希望对你有所帮助。

【讨论】:

  • 是的,为了让你的循环花费更一致的时间(尽管 Thread.sleep 并不完全一致)。查看我包含的链接。
  • 所以即使我使用的方法是在共享对象上同步的,我仍然需要检查弹珠是否能够移动(检查它的下一个位置是否会导致与下一个弹珠重叠)?
  • 是的。您需要将检查放在 move 方法(或 move 方法调用的另一个方法)中,以便每次弹珠尝试移动时都会调用它。想象一下,如果所有的弹珠已经相互接触,而后面的弹珠试图向前移动。此刻其他弹珠都没有移动,因此弹珠可以调用 move 方法,但实际上不应允许它移动,因为那样它会直接与前面的弹珠重叠。
  • 是否需要同步move方法?
  • 如果它没有以某种方式同步,那么你可能有两个弹珠试图同时移动,它们最终可能会重叠。所以是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2022-10-14
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多