【发布时间】:2017-12-19 00:58:03
【问题描述】:
我有一个套接字服务器,它使用 ExecutorService 为每个新套接字创建一个新线程。我还有一个类的静态实例,它可以进行所有线程都使用的数据库调用。
我的服务器用于在线国际象棋比赛。当用户进行移动时,移动被发送到服务器,并在数据库中创建一个条目,其中包含有关移动的一般信息(包括匹配的 ID)。每隔 10 秒左右,如果比赛的其他客户端也有一个到服务器的活动套接字,它将要求服务器获取有关比赛的所有新数据。
它可以工作,但正如您可以想象的那样,如果连接了非平凡数量的玩家,效率会非常低。我想要的是一种让线程窥视线程池并根据 ID(使用该线程的客户端的 ID)找到另一个线程的方法,然后调用该线程上的方法以向对方球员。
我一直在寻找,但我没有运气。这样的事情可能吗?如果是,是否可取?即使在代码方面有点冒险,我也愿意采取额外的措施来降低风险,从而获得巨大的资源节约优势。
【问题讨论】:
-
方法属于类/对象而不是线程。您需要的是一种在 2 个玩家/线程之间发出信号的方式,表明已经采取了行动。想想当一个玩家按下按钮,另一个需要移动时的两个时钟
-
播放器类中的两个原子/易失性布尔值应该可以为您解决问题
-
让数据库不碍事。仅当您想稍后重新创建匹配时才有用。玩家只需要对手的最后一步,甚至布尔值可能都是额外的。
-
是的,这篇文章让我很困惑,因为线程中不存在未调用的方法——恐怕这没有意义,而且你不能从一个线程在单独的线程上调用方法。这个结构根本不存在。
-
是的。它会让你大吃一惊,直到你发现这是不可能的。
标签: java multithreading sockets server