Java线程即使在while循环完成时也不停止

Java线程即使在while循环完成时也不停止,java,multithreading,swing,terminate,Java,Multithreading,Swing,Terminate,我有一个客户机-服务器应用程序。问题是,当我单击“退出”按钮时,它不会杀死整个线程。它会终止进程,但线程仍保持活动状态。但是,如果我单击“X”按钮,JOptionPane.showConfirmDialog将停止所有操作,因此我希望该按钮也能执行相同的操作(终止) p.p.“退出”按钮启动正在调用disconnect()的JSwingWorker } 这是我单击“退出”按钮时发生的情况: 这是当我单击JFrame上的“X”按钮(终止)时发生的情况: 使用Swing时,需要终止VM才能退出。例如

我有一个客户机-服务器应用程序。问题是,当我单击“退出”按钮时,它不会杀死整个线程。它会终止进程,但线程仍保持活动状态。但是,如果我单击“X”按钮,JOptionPane.showConfirmDialog将停止所有操作,因此我希望该按钮也能执行相同的操作(终止)

p.p.“退出”按钮启动正在调用disconnect()的JSwingWorker

} 这是我单击“退出”按钮时发生的情况:

这是当我单击JFrame上的“X”按钮(终止)时发生的情况:

使用Swing时,需要终止VM才能退出。例如,使用
System.exit(0)

此serverClosedByButton在哪里声明?使用Swing时,需要终止VM以退出。例如,使用
System.exit(0)ΦXocę웃 Пepeúpaツ 整个代码有300行,我发布了必要的信息:)它们是私有声明的。它退出循环,但不终止。我将尝试System.exitnow@SergiyMedvynskyy是的,成功了!您可以将此作为新答案发布,因此我可以将其标记为答案:)谢谢!
@Override
public void run() {
    synchronized (this) {
        while (!serverDownAfterTry && !serverClosedByButton) {
            multicastSocket = connectToMulticastAddress(multicastIP);
            mediator = new Mediator(multicastSocket, this, objectOutput, userName);
            mediator.setSocketIP(clientSocket.getInetAddress().toString());
            mediator.setSocketPort(clientSocket.getPort());
            String input = "";
            if (connected) {
                mediator.writeOnMulticastAddress("USER_CONNECTED " + this.userName);
                mediator.executeCommands("SYSTEM_MESSAGE " + this.userName, clientGUI);
                input = mediator.listenToMultiCast(multicastSocket);
            }
            while (!multicastSocket.isClosed()) {
                input = mediator.listenToMultiCast(multicastSocket);
                if (input != null) {
                    mediator.executeCommands(input, clientGUI);
                }
            }
        }
    }
}

public void disconnect() {
    clientGUI.dispose();
    serverClosedByButton = true;
    multicastSocket.close();
    try {
        objectOutput.close();
        clientSocket.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}