在各种连接池场景下,当应用发生了关闭。那么所有连接池(数据源、请求业务线程)都会强行的中止线程,如果此时正在发生一些较为重要的业务操作也会被强制停止。
因此作为有经验的工程师,我们会通过Runtime::addShutdownHook()来帮助我们注册JVM的关闭钩子,已达到JVM虚拟机正在关闭时,主动调用shutdown方法关闭线程池释放资源。
try {
poolExecutor.shutdown();
if (!poolExecutor.awaitTermination(AWAIT_SECOND, TimeUnit.SECONDS) {
poolExecutor.shuwdownNow();
}
} catch (InterruptException e) {
poolExecutor.shutdownNow();
Thread.currentThread().interrupt();
}
甚至你可以通过注册关闭钩子来完成内存数据的持久化。
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try (FileWriter writer = new FileWriter("data.txt")) {
for (String str : data) {
writer.write(str + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}));