2013-05-17 124 views
1

我正在做一个Java多玩家的回合制游戏,我想限制每个球员必须使他们的行动的时候,游戏是由游戏会话或房间,每个房间有4个玩家。 这场比赛有大约40场比赛,每场比赛至少有160转。游戏服务器翻转计时器

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

在理论上似乎不错,但我有一些顾虑,所以我想知道:

  • 这是正确的做法?或者有更好的选择?

  • 我能不能对所有游戏会话为每个游戏会话ScheduledThreadPool代替 一个SingleThreadScheduledExecutor

  • 我注意到,取消ScheduledFuture将保持在 内存中,直到他的执行时间,可这是一个问题的 内存使用情况?

  • 最后,是否可以重复使用相同的runnable(每个游戏 会话为1),而不是每次都创建一个新的游戏。

回答

0

A ScheduledExecutorService是一个很好的开始。只要记住要正确地同步你的游戏状态。

它一般是合法的回收一个可运行的,但是这可能不是这里最好的选择。

除非匝数打算是巨大的,取消任务的开销是不值得的。相反,请在您的可运行信息中包含何时轮换什么游戏。当任务执行时,检查游戏状态以查看是否仍然是当前回合,如果回合数已经移动,则不执行任何操作。

这避免了cancel()完成,任务执行,当移动提交接近最后期限,会发生之间的竞争条件。

+0

圈数将以每小时左右30.000。让任务执行,只检查游戏状态接近更简单的解决方案,但是在记忆方面,你认为取消ScheduledFuture会更好吗? – Rias

+0

每个对象都将低于20个字节。所以如果最后期限是一个小时的话,那核心功能只有~60万,这没什么。如果截止日期是一天,那还不到15megs,这还不足以担忧。如果截止日期更长,您可能希望将截止日期保存到磁盘,并定期扫描它们,并且只安排那些不久的将来。 –