【发布时间】:2015-04-29 06:07:46
【问题描述】:
早安,
我有一个 ServerSocket 的无限循环,工作正常...问题是当我尝试使用按钮启动 ServerSocket 时。我的用户界面“冻结”什么都没有动,但是服务器已经启动并且很好,这里有一个 ScreenShot:
http://i.gyazo.com/15d331166dd3f651fc7bda4e3670be4d.png
当我按下“Iniciar”按钮时,表示启动服务器,用户界面冻结(ServerSocket 无限循环)。 我无法更改我的代码,因为它工作正常。
public static void iniciarServer() {
try {
appendString("\nServidor iniciado.");
System.out.println("asdasd");
} catch (BadLocationException e1) {
e1.printStackTrace();
}
try {
ss = new ServerSocket(1234, 3);
while (true) {
System.out.println("Esperando conexiones...");
appendString("\nEsperando conexiones...");
Socket s = ss.accept();
System.out.println("Conexión entrante: " + s.getRemoteSocketAddress());
appendString("\nConexión entrante: " + s.getRemoteSocketAddress());
conexiones++;
//System.out.println("Debug: conexiones SERVER: " + conexiones);
MultiThread mt = new MultiThread(s, conexiones);
mt.start();
///////////////////////////////////////////////////////////////
}
} catch (IOException e) {
System.out.println("Error Server: " + e.getMessage());
} catch (BadLocationException e) {
e.printStackTrace();
}
stopServer();
}
appendString(); 用于向 JTextPane 添加一些文本,但由于 UI 冻结而无法正常工作。
有什么方法可以让用户界面不会被无限循环冻结?
谢谢!
【问题讨论】:
-
Swing 是一个单线程框架,这意味着在事件调度线程的上下文中执行的任何阻塞或长时间运行的操作都会阻止它处理事件队列,从而使您的应用程序挂起。它也不是线程安全的,因此您永远不应该尝试从 EDT 外部修改任何 UI 组件的状态。查看Concurrency in Swing 和Worker Threads and SwingWorker 了解更多详情