暂停/恢复线程中的任意计算

时间:2012-08-24 01:05:23

标签: java concurrency

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

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

2 个答案:

答案 0 :(得分:0)

如果你想“暂停”当前线程,java.util.concurrent.locks.LockSupport可以帮助你。如果你想暂停其他线程,我认为它不在java设计的范围内,你只能中断另一个线程,或者设置一个标志,而不是暂停。

答案 1 :(得分:0)

你不能“暂停一个线程”,你不能指望玩家遵守你的“玩得好”并检查标志等的请求。你可以打断另一个线程,但线程中运行的代码可以很容易从中恢复过来。因此,您需要一种方法让控制线程保持控制。

而不是担心线程在做什么,你可以:

  • 为玩家线程提供最长时间来返回操作,如果他们没有及时返回,请执行“默认操作”
  • 记录他们花费多少时间计算并更频繁地打电话给他们使用更少的时间等等。

java.util.concurrent库可以满足大多数此类问题。退房: