Java 如何在另一个类中杀死一个类的实例?
我正在制作一个客户机-服务器应用程序,其中用户可以从gui打开或关闭服务器;为了让它工作,我使用了SwingWorker嵌套类。 所有这些似乎都正常工作,但当我关闭服务器并重新打开它时,它不工作,可能是因为还有一个打开的实例无法覆盖:服务器在accept()方法上被阻塞。 我想在用户按下关闭按钮时终止上一个实例,但我不知道如何终止 以下是SwingWorker类给我带来的问题:Java 如何在另一个类中杀死一个类的实例?,java,instance,kill,Java,Instance,Kill,我正在制作一个客户机-服务器应用程序,其中用户可以从gui打开或关闭服务器;为了让它工作,我使用了SwingWorker嵌套类。 所有这些似乎都正常工作,但当我关闭服务器并重新打开它时,它不工作,可能是因为还有一个打开的实例无法覆盖:服务器在accept()方法上被阻塞。 我想在用户按下关闭按钮时终止上一个实例,但我不知道如何终止 以下是SwingWorker类给我带来的问题: class SwingWorkGUI extends SwingWorker { @Overr
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;
}
}
每次按下“打开”按钮时,执行的操作将确定服务器是否已打开,如果未打开,则运行
SwingWorkGUI swg = new SwingWorkGUI();
swg.execute();
以下指令中的执行块,但仅在第二次(第三次,ecc.)调用时执行:
mainServer = new Server();
Server.up是一个静态变量,可以帮助我在服务器中终止while(true)方法
如何在不关闭所有应用程序的情况下杀死打开的实例?如果我理解正确,您的问题是
ServerSocket
对象在accept()
调用中被阻止,您需要取消阻止它。一些选择:
ss.close()
(假设ss
是您的ServerSocket
对象)。这将使accept()
抛出SocketException
。参考:套接字
,并连接到您自己的服务器。这将取消阻止accept()
调用。现在,您可以检查您的服务器.up
标志服务器套接字上设置超时,例如5秒。这将使accept()
在超时时抛出中断异常。参考:
如果在单独的线程上运行服务器,则可以存储对该线程的引用,并在其上调用
interrupt()
,然后清除对服务器的引用。这将导致服务器退出正在执行的任何操作。(您可能还希望捕获服务器上的InterruptedException
s,并根据需要进行一些内部清理)。从外部线程调用socket.close()
以中断socket.accept()
方法,然后关闭服务器: