簡體   English   中英

如何在另一個類中殺死一個類的實例?

[英]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對象,你需要取消阻止它。 一些選擇:

  1. 從另一個線程調用ss.close() (假設ss是您的ServerSocket對象)。 這將使accept()拋出一個SocketException 參考: ServerSocket.close() Javadocs

  2. 從另一個線程創建一個新的Socket並連接到您自己的服務器。 這將取消阻止accept()調用。 現在,您可以檢查Server.up標志。

  3. ServerSocket上設置超時,例如5秒。 這將使accept()在超時時拋出InterruptedIOException 參考: 用於SO_TIMEOUT Javadocs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM