如何在另一个类中杀死一个类的实例?

ten*_*nik 5 java kill instance

我正在创建一个客户端 - 服务器应用程序,用户可以从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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

每次按下"打开"按钮,actionPerformed将确定服务器是否已经打开,如果没有,则运行

SwingWorkGUI swg = new SwingWorkGUI(); 
swg.execute();
Run Code Online (Sandbox Code Playgroud)

执行在以下指令中阻止,但只调用它的第二个(第三个,ecc.)时间:

mainServer = new Server();
Run Code Online (Sandbox Code Playgroud)

Server.up是一个静态变量,可以帮助我杀死服务器中的while(true)方法.

如何在不关闭所有应用程序的情况下终止打开实例?

Gro*_*uez 0

如果我理解正确,您的问题是该ServerSocket对象在调用时被阻止accept(),您需要取消阻止它。一些选项:

  1. 从另一个线程调用ss.close()(假设ss是您的ServerSocket对象)。这将使accept()抛出一个SocketException. 参考:JavadocsServerSocket.close()

  2. 从另一个线程创建一个新Socket线程并连接到您自己的服务器。这将解锁accept()呼叫。现在你可以检查你的Server.up旗帜了。

  3. 设置超时ServerSocket,例如 5 秒。这将使accept()抛出InterruptedIOException超时。参考:JavadocsSO_TIMEOUT