【问题标题】:Multi-Threading Server with shared Resource具有共享资源的多线程服务器
【发布时间】:2014-02-10 12:51:13
【问题描述】:

我正在尝试用 Java 制作一个简单的游戏。我想编写一个接受多个玩家的服务器。这是游戏的元数据:

玩家连接到服务器玩游戏,并指定一个数字。每个玩家只玩一场游戏。游戏只有在 4 名玩家连接时才开始或解决。如果所有玩家人数之和大于 21 则全输,否则全赢。比赛结束后,必须警告每个玩家是否输赢。

赢/输检查的算法,或接受多个客户我明白了。我的疑问是什么应该是线程(或可运行对象)和/或什么是共享资源。只需几条指导方针,我就可以实现它。

【问题讨论】:

  • 您尝试了哪些操作,哪些操作没有按照您的预期工作?
  • 我对并发的工作方式有点困惑。我可以用代码和修复的方式来做到这一点,就像一个游戏是一个带有玩家列表的可运行对象,当我有 4 个玩家时才开始/创建。比赛结束后,会将结果打印给每个客户端。但我真正想要的是每个客户端都是一个线程,在输入数字后保持阻塞(等待()),当所有玩家介绍他们的数字时,会被警告继续并打印结果。
  • 您应该尽可能避免使用多线程。多线程会导致死锁和竞争条件,从而导致难以重现且无法重现错误。 Java 提供了New-IO,这是一种在一个线程中处理大量客户端的方法。

标签: java multithreading concurrency


【解决方案1】:

我从您的陈述中了解到,您需要确切的 4 名玩家来决定游戏的结果。每个玩家在连接服务器时传递一个数字,他/她不能再输入或传递任何东西。

所以共享资源是 TOTAL SUMNUMBER OF CONNECTION 并且线程是 连接到服务器。所以每当玩家请求连接你时,启动一个新线程,这个线程增加共享的 TOTAL SUMNUMBER OF CONNECTION 并且在增加之后还要检查总和的值和不。连接。

【讨论】:

  • 那么,在 Game 类中(如果存在的话)应该如何开始呢?更具体地说,我如何将玩家和游戏联系起来?
  • 你可以有一个实现可运行的游戏类,它具有所有共享资源和运行方法。构造函数将输入作为数字并启动这个内部线程。内部线程或运行方法将实现所有游戏逻辑。还有另一个类 CONNECTION 创建和启动 GAME 线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多