我正在制作一个Java多玩家回合制游戏,我想限制每个玩家必须移动的时间,游戏由游戏会议或房间组成,每个房间有4个玩家。 游戏有大约40个游戏会话,每个会话至少有160个回合。
首先我查看了java.util.Timer
,然后我发现ScheduledExecutorService
看起来好多了,我可以为每个游戏会话设置SingleThreadScheduledExecutor
,每回合创建一个新的runnable如果玩家make在runnable执行之前移动,我可以调用ScheduledFuture.cancel()
方法。
理论上看起来很好,但我有一些顾虑,所以我想知道是否:
这是正确的做法吗?还是有更好的选择?
我是否可以为所有游戏会话设置ScheduledThreadPool
每个游戏会话一个SingleThreadScheduledExecutor
?
我注意到取消ScheduledFuture
会将其保留在。{
记忆直到他的执行时间,这可能是一个问题
内存使用情况?
最后,是否可以重复使用相同的runnable(每场比赛1次) 会话)而不是每回合创建一个新的。
答案 0 :(得分:0)
ScheduledExecutorService
是一个很好的起点。只需记住正确同步您对游戏状态的访问权限。
回收可运行的通常是合法的,但这可能不是最好的选择。
除非转弯数量巨大,否则取消任务的开销不值得。相反,请在您的可运行信息中包含正在计时的游戏内容。当任务执行时,检查游戏状态以查看是否仍然是当前转弯,如果转弯计数已经移动,则不执行任何操作。
这可以避免cancel()
完成和执行任务之间的竞争条件,就像在截止日期前提交移动时一样。