重新创建ServerSocket后,我的GUI冻结了

时间:2013-04-17 20:53:41

标签: java multithreading port serversocket

我的服务器是围绕更新监听套接字的支持构建的,通过这样做我使用以下方法。我的问题发生在第二次调用此方法之后,首先在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();
}

1 个答案:

答案 0 :(得分:3)

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