【发布时间】:2018-12-12 08:04:03
【问题描述】:
我正在尝试使用 ctrl-c 键盘快捷键关闭我的服务器,我搜索了一些方法来执行此操作并找到了 this 帖子。
我尝试了这个解决方案,但是当关闭挂钩完成时,我的主线程也没有完成服务器关闭任务,并且进程以代码 1 结束。
这是我的代码:
package test;
import java.io.IOException;
import java.net.ServerSocket;
public class Main implements Runnable {
private ServerSocket serverSocket;
private Main() {
try {
serverSocket = new ServerSocket(5000);
} catch (IOException e) {
e.printStackTrace();
System.exit(10);
}
System.err.println("Waiting ctrl-c ...");
Runtime.getRuntime().addShutdownHook(new Thread(this));
try {
while (serverSocket.accept() != null) {
doSomething();
}
System.err.println("end while");
} catch (IOException e) {
System.err.println("end exception");
} finally {
System.err.println("trying to close the server...");
try {
// simulate a long job
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// this line was never reached
System.err.println("server closed");
}
}
public static void main(String[] args) {
new Main();
}
private void doSomething() {}
@Override
public void run() {
System.err.println("ctrl-c pressed");
try {
System.err.println("trying to close socket");
serverSocket.close();
System.err.println("socket closed!!!");
} catch (IOException e) {
System.err.println("failed to close socket");
}
}
}
这是 IntelliJ IDE 内部的输出:
Waiting ctrl-c ...
ctrl-c pressed
trying to close socket
socket closed!!!
end exception
trying to close the server...
Process finished with exit code 1
我该如何优雅地解决这个问题?
【问题讨论】:
-
请避免发帖images of text。
-
当你按下 ctrl-c 时,主线程最终进入 finally 块并在那里休眠,同时 jvm 开始关闭,它调用了关闭钩子,但 没有 等待主线程从睡眠中出来。这就是您看不到“服务器已关闭”的原因。
标签: java multithreading server