带服务器的Java关闭钩子

带服务器的Java关闭钩子,java,server,shutdown-hook,Java,Server,Shutdown Hook,我正在用java编写一个基本服务器。我有一个等待请求的服务器类: class Server{ public void listen(){ ServerSocket listenSocket = new ServerSocket(port); while(true){ Socket clientSocket = listenSocket.accept(); // start new thread for th

我正在用java编写一个基本服务器。我有一个等待请求的服务器类:

class Server{
    public void listen(){
        ServerSocket listenSocket = new ServerSocket(port);

        while(true){
            Socket clientSocket = listenSocket.accept();
            // start new thread for the connection
            new Connection(clientSocket, this).start();
        }
    }

    public void save(){
        //save stuff
    }
}
我在程序中添加了一个ShutdownHook,这样它可以在关机时保存数据。我的主要观点如下:

Server server = new Server();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    @Override
    public void run() {
        server.save();
    }
}));
server.listen();

但是只有当我删除server.listen()时,关闭钩子才会启动;(当它不在while(true)中时)。有没有办法在退出时保存服务器的数据?

将调用
listen()
的线程设为执事线程。调用listen()的线程是主线程。如果我将其设置为deamon线程,它将抛出IllegalThreadStateException。请设置deamon线程并从那里调用。尝试了该操作,但无效。我找到了原因:我想IntelliJ会主动终止进程,不会让关闭挂钩运行。如果我用cmd运行服务器并用ctrl+c(在windows上)关闭它,钩子就会运行