Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在另一个类中杀死一个类的实例?_Java_Instance_Kill - Fatal编程技术网

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

Java 如何在另一个类中杀死一个类的实例?,java,instance,kill,Java,Instance,Kill,我正在制作一个客户机-服务器应用程序,其中用户可以从gui打开或关闭服务器;为了让它工作,我使用了SwingWorker嵌套类。 所有这些似乎都正常工作,但当我关闭服务器并重新打开它时,它不工作,可能是因为还有一个打开的实例无法覆盖:服务器在accept()方法上被阻塞。 我想在用户按下关闭按钮时终止上一个实例,但我不知道如何终止 以下是SwingWorker类给我带来的问题: class SwingWorkGUI extends SwingWorker { @Overr

我正在制作一个客户机-服务器应用程序,其中用户可以从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;
        }
    }
每次按下“打开”按钮时,执行的操作将确定服务器是否已打开,如果未打开,则运行

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()
    方法,然后关闭服务器: