[英]How do I kill an instance of a class in another class?
我正在創建一個客戶端 - 服務器應用程序,用戶可以從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)方法。
如何在不關閉所有應用程序的情況下終止打開實例?
如果我理解正確你的問題是在accept()
調用上阻塞了ServerSocket
對象,你需要取消阻止它。 一些選擇:
從另一個線程調用ss.close()
(假設ss
是您的ServerSocket
對象)。 這將使accept()
拋出一個SocketException
。 參考: ServerSocket.close()
Javadocs
從另一個線程創建一個新的Socket
並連接到您自己的服務器。 這將取消阻止accept()
調用。 現在,您可以檢查Server.up
標志。
在ServerSocket
上設置超時,例如5秒。 這將使accept()
在超時時拋出InterruptedIOException
。 參考: 用於SO_TIMEOUT
Javadocs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.