带服务器的Java关闭钩子
我正在用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
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上)关闭它,钩子就会运行