1

我正在制作一个编程游戏,玩家可以在其中对盟友的行为进行编程。玩家为给定的盟友编写decision() 函数的主体,可以用任何Java 代码填充该主体,但必须返回一个动作。我想给每个盟友一组,每次滴答的计算量有限,所以 1)添加更多实体不会使游戏减慢太多,2)实体花费计算的时间会反映在游戏中,所以如果一个盟友花更多的时间“思考”它会减少行动。我对它应该如何工作的灵感是Battlecode,它为单位每轮提供一定数量的字节码,然后暂停计算并让程序员在事情发生变化时处理注意事项。

我的问题是如何暂停和恢复正在线程中执行决策功能的实体。我知道这样做的“正确”方法是设置一个标志,告诉线程暂停并偶尔检查它,但由于我不能强制玩家在 decision() 函数中检查标志,所以我不知道如何暂停线程。实体只查看世界的固定表示,只需要返回一个枚举值,所以我认为他们不应该锁定任何东西,但我希望有比使用已弃用的更好的方法来做到这一点线程暂停方法。我愿意改变玩家编写代码的方式,但我想不出一种方法来做到这一点,同时仍然向用户隐藏暂停标志检查,而不会使编写决策循环变得混乱和繁重。

4

2 回答 2

0

如果您想“暂停”当前线程,java.util.concurrent.locks.LockSupport 可能会帮助您。如果要暂停其他线程,我认为不属于java设计的范围,只能中断另一个线程,或者设置一个标志,不能暂停。

于 2012-08-24T02:55:45.263 回答
0

您不能“暂停线程”,也不能期望玩家遵守您的要求“玩得好”并检查标志等。您可以中断另一个线程,但线程中运行的代码可以轻松恢复这。因此,您需要一种方法让控制线程保持控制。

不必担心线程在做什么,您可以:

  • 给玩家线程一个最大的时间来返回动作,如果他们没有及时返回,执行一个“默认动作”
  • 记录他们花了多少时间计算并更频繁地打电话给他们是他们使用的时间更少等

大多数这些类型的问题都由java.util.concurrent图书馆解决。查看:

于 2012-08-24T03:07:03.827 回答