我想在我的程序与其他玩家连接时显示框架。但即使Frame在自己的Thread中运行,它仍然处于冻结状态,而Serversocket正在尝试连接。我怎样才能防止它冻结?即使在其他线程中启动,框架也会冻结
public static boolean connectH(String check, String data, int k){
ServerSocket serverSocket = null;
Socket clientSocket = null;
PrintWriter out = null;
BufferedReader in = null;
message = "waiting for someone to connect to your " + check + "-game";
th = new Thread(){
@Override
public void run() {
c = new Canceler(message);
}
};
th.start();
try {
serverSocket = new ServerSocket(Integer.parseInt(data));
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Could not listen on port: " + data);
Main.m.finishgame(-1);
}
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
try {
out = new PrintWriter(clientSocket.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
}
try {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
try {
if (in.readLine().equals(check)){
out.println(k);
c.remove();
return true;
}else{
out.println(String.valueOf(-1));
c.remove();
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
c.remove();
return false;
}
你是如何处理你的线程?在这种情况下,您可能需要使用[SwingWorker](http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html)。 – Surveon
'clientSocket = serverSocket.accept();'导致你的'JFrame'冻结,因为它阻塞了'Event Dispatcher Thread'。这部分应该在另一个'Thread'或'SwingWorker'上,如前所述:-) –
你不应该“在不同的线程上运行帧”。所有框架和GUI代码应该在单个线程上运行:AWT-Dispatch线程。您应该将所有其他长时间运行的代码(例如等待接受套接字连接)移至工作线程。 SwingWorker可以使这更容易。 –