【发布时间】:2013-05-22 10:53:59
【问题描述】:
我正在制作一个客户端-服务器应用程序,用户可以在其中通过 gui 打开或关闭服务器;为了让它工作,我使用了 SwingWorker 嵌套类。 一切似乎都正常工作,但是当我关闭服务器并重新打开它时它不起作用,可能是因为还有另一个无法覆盖的实例打开:服务器在 accept() 上被阻止方法。 当用户按下关闭按钮时,我想杀死前一个实例,但我不知道如何。
这是给我带来问题的 SwingWorker 类:
class SwingWorkGUI extends SwingWorker
{
@Override
protected Integer doInBackground() throws Exception {
int delay = 1000;
final Timer time = new Timer(delay, null);
time.addActionListener( new java.awt.event.ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (Server.up == true){
upTimeMillis += 1000;
long diff = upTimeMillis/1000;
long numHrs = diff/60;
diff = diff%60;
long numMins = diff/60;
long numSecs = diff%60;
upTime.setText(numHrs + ":" + numMins + ":" + numSecs);
}
else {
upTime.setText("Server Actually Down");
time.stop();
}
}
});
time.start();
mainServer = new Server();
return null;
}
}
每次按下开启按钮时,actionPerformed 判断服务器是否已经开启,如果没有则运行
SwingWorkGUI swg = new SwingWorkGUI();
swg.execute();
以下指令中的执行块,但只有第二次(第三次,ecc.)被调用:
mainServer = new Server();
Server.up 是一个静态变量,可以帮助我终止服务器中的 while(true) 方法。
如何在不关闭所有应用程序的情况下终止打开的实例?
【问题讨论】:
-
如果您在单独的线程上运行服务器,您可以存储对该线程的引用并在其上调用
interrupt(),然后清理对服务器的引用。这应该导致服务器退出它正在做的任何事情。 (您可能还想在Server上捕获InterruptedExceptions,并根据需要进行一些内部清理)。 -
从外部线程调用
socket.close()以中断socket.accept()方法,然后关闭您的服务器:stackoverflow.com/questions/2983835/…