我正在学习Java,我试图创建一个简单的客户端 - 服务器应用程序。我的服务器有GUI,还有一个启动服务器的按钮。点击后,另一个线程启动。我将其称为主服务器线程,因为它处理连接和handels客户端。我也有按钮来关闭服务器但不是整个应用程序。我关闭ServerSocket来中断这个线程,所以我可以停止服务器。我想要消息对话框弹出inf finally块来通知我服务器停止运行。 以下是服务器运行方法的简化和修改代码:
public void run(){
try{
JOptionPane.showMessageDialog(null,"begining");
ss = new ServerSocket(TCP_PORT);
while(cont){
Socket sock = ss.accept();
exec.execute(new ServerThread(sock));
}catch(SocketException soex){
//JOptionPane.showMessageDialog(null,"SocketException");
}finally{
JOptionPane.showMessageDialog(null,"finally");
}
//JOptionPane.showMessageDialog(null,"after finally");
}
第一个消息对话框显示正确,但是当由于异常而弹出其他3个对话框时,我只会看到带有标题和窗口边框的灰色消息对话框,但没有消息或任何按钮。我无法关闭它,我无法关闭我的申请。它停留在那里。
我正在使用Ubuntu,并使用open-jdk javac版本“1.7.0_25”进行编译,并使用相同版本的java运行它。我也尝试过1.6版本,还有Oracle 1.7.0_25(java和javac)。每次我得到相同的结果。
这里有什么问题,我该如何解决?
答案 0 :(得分:3)
Concurency in Swing是您的问题,所有更新must be done on EDT
必须在Top-Level Containers上创建所有Initial Thread,对其衍生产品有效(JOptionPane is derivate from JDialog)
请参阅here is demonstrations of your issue,然后应用程序是候选人(可能只是杀死),适用于TaskManager