我的服务器是围绕更新监听套接字的支持构建的,通过这样做我使用以下方法。我的问题发生在第二次调用此方法之后,首先在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();
}
答案 0 :(得分:3)
您需要调用listeningThread.start()
,这将创建一个新线程。现在,您只是在当前线程上调用线程的run()
方法。你第一次这样做是有效的,因为你在主线程上。但是,第二次,你在UI线程上,对按钮按下做出反应。这会导致UI线程阻塞。