【问题标题】:Java TCP synchronized methodJava TCP同步方法
【发布时间】:2016-04-12 16:32:02
【问题描述】:

My result

Expected result

public void run () {
  try {
     handlers.addElement (this);
     broadcast("Welcome " + name);
     while(handlers.size() != 2){
         if(handlers.size() > 2){
             this.out.writeUTF ("The Room is full!");
             this.out.flush();
             handlers.removeElement(this);
             socket.close();
         }
     }
     broadcast("No of Player: " + handlers.size());
     for(int i = 0; i < handlers.size(); i++){
        GameHandler player = (GameHandler) handlers.get(i);
        broadcast("Player " + (i + 1) + ": " + player.name);
     }
     System.out.println("Game starts!");
     startGame(4);
     ....
}

protected static void broadcast (String message) {
  synchronized (handlers) {
     Enumeration e = handlers.elements ();
     while (e.hasMoreElements ()) {
        GameHandler handler = (GameHandler) e.nextElement ();
        try {
           handler.out.writeUTF (message);
           handler.out.flush ();
        } catch (IOException ex) {
           handler.stop ();
        }
     }
  }

}

问题是预期结果和我的实际结果之间的差异。我不知道为什么while循环之前的广播运行正常而其他的运行两次

【问题讨论】:

  • 请提供变量处理程序的声明
  • handlers 是一个存储(this)的Vector

标签: java multithreading tcp synchronized


【解决方案1】:

您的问题是,在您的情况下,每个线程都在发送广播。您需要有一个“主”/“服务器”游戏线程来执行“系统公告”广播,或者选择一个客户端线程(可能是“玩家 1”线程?)来发送公告。

【讨论】:

  • 但是为什么第一次广播只做一次呢?
【解决方案2】:

问题是预期结果和我的实际结果之间的差异。我不知道为什么while循环之前的广播运行正常而其他的运行两次

您确实没有就您的问题提供足够的详细信息,但我看到了这些问题:

  • 您谈论 TCP 并且代码提到了套接字,但您正在处理本地 elements 集合。除非您通过 TCP 与同一个 JVM 通信(这很奇怪),否则 elements 集合将在每个客户端上启动 2 个播放器。这真的是您所期望的吗?
  • 即使您说elementsVector,您仍然需要在run() 方法的开头对其进行synchronize,因为您正在对其执行多个操作并且存在竞争条件。例如,如果添加了 3 个处理程序,它们将全部删除自己并关闭自己的套接字。
  • Vector 确实是一个过时的集合。你应该使用别的东西。
  • 当第一个线程将自己添加到elements 时,它会进入一个旋转循环,等待第二个人加入游戏。那里好像很浪费。一些小的Thread.sleep(...) 是合适的。
  • 如果房间已满,我怀疑线程应该来自run() 方法的return;。相反,它继续我怀疑它不好。

希望这里有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2011-09-21
    • 2011-11-08
    相关资源
    最近更新 更多