1

我正在制作一个 Java 多人回合制游戏,我想限制每个玩家必须移动的时间,游戏由游戏会话或房间组成,每个房间有 4 名玩家。游戏有大约 40 个游戏环节,每个环节至少有 160 个回合。

首先我查看了java.util.Timer,然后我发现ScheduledExecutorService似乎更好,我可以SingleThreadScheduledExecutor为每个游戏会话创建一个新的可运行对象,如果玩家在可运行对象执行之前移动,我可以调用该ScheduledFuture.cancel()方法。

理论上它看起来不错,但我有一些担忧,所以我想知道:

  • 这是正确的方法吗?还是有更好的选择?

  • 我可以只ScheduledThreadPool为所有游戏会话而不是SingleThreadScheduledExecutor每个游戏会话一个吗?

  • 我注意到取消 aScheduledFuture会将它保留在内存中,直到他的执行时间,这可能是内存使用的问题吗?

  • 最后,是否可以重复使用相同的可运行文件(每个游戏会话 1 个)而不是每回合创建一个新的。

4

1 回答 1

0

AScheduledExecutorService是一个很好的起点。请记住正确同步您对游戏状态的访问。

回收可运行文件通常是合法的,但这可能不是最好的选择。

除非回合数很大,否则取消任务的开销是不值得的。相反,在您的可运行信息中包含关于正在计时的游戏的哪个回合。当任务执行时,检查游戏状态是否仍然是当前回合,如果回合计数已经开始,则什么也不做。

这避免了完成和任务执行之间的竞争条件cancel(),就像在接近截止日期时提交移动时发生的那样。

于 2013-05-17T11:20:09.077 回答