我正在制作一个编程游戏,玩家可以在其中编制盟友的行为。玩家为给定的盟友编写decision()函数的主体,可以用任何java代码填写但必须返回一个动作。我想给每个盟友一个限定量的计算每个刻度,以便1)添加更多实体不会减慢游戏速度,2)实体花费计算的时间反映在游戏中,所以如果是盟友花更多的时间“思考”它会减少行为。我对这应该如何工作的灵感是Battlecode,它为每个单位提供了一定量的字节码,然后暂停计算并让程序员处理注意事项发生了变化。
我的问题是如何暂停和恢复在线程中执行决策功能的实体。我理解这样做的“正确”方法是设置一个标志告诉线程暂停并偶尔检查,但由于我不能强制玩家检查decision()函数中的标志,我是不知道如何暂停线程。实体只是查看世界的固定表示,只需返回一个枚举值,所以我认为它们不应该锁定任何东西,但我希望有一个更好的方法来做这个比使用已弃用的线程暂停方法。我愿意改变播放器编写代码的方式,但我仍然无法想到一种方法,同时仍然隐藏用户的暂停标记检查,而不会使编写决策循环混乱和繁琐。必须有一些方法可以做到这一点,因为Battlecode做到了,但我在网上搜索有关如何的详细信息。
答案 0 :(得分:0)
如果你想“暂停”当前线程,java.util.concurrent.locks.LockSupport可以帮助你。如果你想暂停其他线程,我认为它不在java设计的范围内,你只能中断另一个线程,或者设置一个标志,而不是暂停。
答案 1 :(得分:0)
你不能“暂停一个线程”,你不能指望玩家遵守你的“玩得好”并检查标志等的请求。你可以打断另一个线程,但线程中运行的代码可以很容易从中恢复过来。因此,您需要一种方法让控制线程保持控制。
而不是担心线程在做什么,你可以:
java.util.concurrent
库可以满足大多数此类问题。退房:
ExecutorService
Executors
用于创建ExecutorService
Callable
了解球员将实施的内容Future
用于获取结果,尤其是Future.get(timeout)
用于限制线程返回结果的时间