【问题标题】:My GUI freezes after I recreate a ServerSocket重新创建 ServerSocket 后,我​​的 GUI 冻结
【发布时间】:2013-04-17 20:53:41
【问题描述】:

我的服务器是围绕支持更新侦听套接字而构建的,这样做我使用以下方法。我的问题发生在第二次调用此方法后,首先在 main 方法启动时调用它,然后通过单击 JFrame 中的按钮调用它。发生的情况是,当通过按钮调用此方法时 JFrame 冻结,正如您从代码中看到的那样,我试图使此方法在新线程中运行服务器,但它并没有改变我的结果。有谁知道如何解决这一问题?或者至少是什么原因造成的?在 main 中调用该方法之后的任何代码也不会执行,所以我认为这是一个线程问题。 (MiniServer 扩展了 Thread 并用于单独处理每个连接的客户端)

public static void startListening(final int port)
{
    listeningThread = new Thread() 
    { 
        public void run()
        {               
            try {
                serverSocket = new ServerSocket(port);

                while(!stop)
                {
                    boolean loop = true;
                    while (loop)
                    {
                        serverSocket.setSoTimeout(1000);

                        try{
                            clientSocket = serverSocket.accept();
                            loop = false;
                        } catch (SocketTimeoutException e){
                        }
                    }
                    if(!clientSocket.equals(null))
                    {
                        MiniServer mini = new MiniServer(clientSocket);
                        mini.start();
                        clientSocket = null;
                    }
                }
            } catch (IOException e) {
            }
        } 
    };
    listeningThread.run();
}

【问题讨论】:

    标签: java multithreading port serversocket


    【解决方案1】:

    您需要调用listeningThread.start(),这将创建一个新线程。现在,您只是在 current 线程上调用线程的 run() 方法。第一次这样做时它会起作用,因为你在主线程上。但是,第二次,您在 UI 线程上,对按钮按下作出反应。这会导致您的 UI 线程阻塞。

    【讨论】:

    • Eclipse 告诉我它不能在原始类型 void 上调用 start(),我应该将方法 run() 更改为 start()?
    • 不,绝对不是。我的意思是您发布的代码的最后一行是listeningThread.run();。该行必须是listeningThread.start();
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多