【问题标题】:How do I kill an instance of a class in another class?如何杀死另一个类中的一个类的实例?
【发布时间】: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/…

标签: java instance kill


【解决方案1】:

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

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

  2. 从另一个线程创建一个新的Socket 并连接到您自己的服务器。这将取消阻止 accept() 呼叫。现在您可以检查您的Server.up 标志了。

  3. 在您的 ServerSocket 上设置超时,例如5秒。这将使accept() 在超时时抛出InterruptedIOException。参考:Javadocs for SO_TIMEOUT

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多