3

我正在制作一个回合制多人游戏,可以循环使用。基本上,一个玩家主持一场比赛,另一个人加入比赛,然后比赛就开始了。我的服务器将需要处理这些匹配并每 5 秒向客户端提供更新。我通常会使用计时器/thread.sleep() 来执行此操作。我的问题是我不确定如何同时为多个比赛执行此操作。我觉得每场比赛使用一个线程会很荒谬,因为它会闲置而不是做任何事情。

我的一个想法是只有一个线程以 5 秒的间隔更新每场比赛。我觉得唯一的问题是,当很多比赛同时进行时,最后更新的游戏可能会出现相当大的延迟。(我不知道这有多重要,因为我的游戏是基于时间的,但它看起来很原始)。

我的另一个选择是使用看起来很有希望的 ScheduledExecutorService(线程池)。

  1. 我是否会因为我还在为套接字连接运行线程池而遇到 ScheduledExecutorService 线程池的问题?

    2.有没有更好的方法来完成我想要实现的目标?

只是为了澄清我正在寻找一种方法,基本上每场比赛每 5 秒调用一次函数。例如:

我的游戏从 0 开始,而你的游戏从 2 秒开始。服务器会调用更新函数:

对我来说:0,5,10,15,20,25 等...

为您:2,7,12,17,22,27 等...

4

1 回答 1

0

如果我理解你是正确的“我的一个想法是只有一个线程以 5 秒的间隔更新每场比赛。” 每秒运行更新脚本会更好,但更新匹配哪个 ID mod 5 == 0。这可以减少 HOT 秒的不良影响。

thread.sleep() 也很糟糕,它不能保证严格的时间。thread.sleep(5000) — 平均睡眠至少 5 秒(但在糟糕的情况下可能是 10 秒甚至更多)

查看Java Timerhttp://www.javacodegeeks.com/2012/07/quartz-2-scheduler-example.html

我认为使用 TimerTask 将是一个很好的决定。

另请参阅游戏的 java 计时器

更新:对于“主题”通知,请查看https://netty.io // 如果您还没有使用它:) 使用异步非阻塞 I/O 对您来说,一个线程就足够了 10000 个同时连接。(在良好的实例 10 - 160 k 连接上,它在真实的商业项目中是真实的)

于 2013-01-17T01:53:16.213 回答