0717-7821348
彩乐乐双色球五行走势

彩乐乐双色球五行走势

您现在的位置: 首页 > 彩乐乐双色球五行走势
ShutdownHook- Java 高雅停机解决方案
2019-12-14 04:22:12

幻想一下,假如你现在刚好在 word 上写需求文档,电脑忽然重启。等候开机完结,你可能会发现写了一个小时文档没有保存,就这么没了。。。

一个正在运转 Java 运用假如忽然将其中止,影响不止数据丢掉,还会形成其他影响。比方:

  • 恳求丢掉:内存行列中等候履行恳求丢掉
  • 数据丢掉:处于内存缓存中数据未耐久化到磁盘
  • 文件损坏:正在写的文件没有没有更新完结,导致文件损坏
  • 事务中止:处理一半的事务被强行中止,如付出成功了,却没有更新到数据库中
  • 服务未下线:上游服务仍然往中止节点发送恳求

所以在封闭服务之前,咱们需求先做好善后工作,比方保存数据,整ShutdownHook- Java 高雅停机解决方案理资源,下线服务,然后才退出运用。这种有方案滑润的封闭运用相对直接中止运用,就显得十分『高雅』。

ps: 细心品尝,高雅停机这个词真好~

ShutdownHook

Java 言语供给一种 ShutdownHook(钩子)进制,当 JVM 接受到体系的封闭告诉之后,调用 ShutdownHook 内的办法,用以完结整理操作,ShutdownHook- Java 高雅停机解决方案然后滑润的退出运用。

ShutdownHook代码如下:

 Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("封闭运用,开释资源");
}));

Runtime.getRuntime().addShutdownHook(Thread超进化武祖) 需求传入一个线程目标,后续动作将会在该异步线程内完结。除了自动封闭运用(运用 kill -15 指令),以下场景也将会触发 ShutdownHook :

  • 代码履行完毕,JVM 正常退出
  • 运用代码中调用 System#exit 办法
  • 运用中发作 OOM 过错,导致 JVM 封闭
  • 终端中运用 Ctrl+C(非后台运转)

现在ShutdownHook- Java 高雅停机解决方案许多开源结构都是根据这个机制完结高雅停机,比方 Dubbo,Spring 等。

相关留意点

ShutdoShutdownHook- Java 高雅停机解决方案wnHook 代码完结起来相对简略,可是咱们仍是需求当心下面这些坑。

Runtime.getRuntime().addShutdownHook(Thread) 能够被屡次调用

咱们能够屡次调用 Runtime.getRuntime().addShutdownHook(Thread) 办法,然后添加多个。可是需求留意的是,多个 ShutdownHook 之间并无任何次序,Java 并不会依照参加次序履行,反而将会并发履行。

所以尽量在一个 ShutdownHook 完结一切操作。

ShutdownHook 需求赶快履行完毕

不要在 ShutdownHook 履行需求被堵塞代码,如 I/0 读写,这样就会导致运用短时刻不能被封闭。

 Runtime.getRuntime().addShutdownHook(new Thread(() -> {
while (true){
System.out.println("封闭运用,开释资源");
}
}));

上面代码中,咱们运用 while(true) 模仿长期堵塞这种极点状况,封闭该运用时,运用将会一向堵塞在 while 代码中,导致运用没办法被封闭。

除了堵塞之外,还需求当心其他会让线程堵塞的行为,比方死锁。

为了防止 ShutdownHook 线程被长期堵塞,咱们能够引进超时进制。假如等候必定时刻之后,ShutdownHook 还未完结,由脚本直接调用 kill -9 强制退出或许 ShutdownHook 代码中引进超时进制。

文章首发于https://studyidea.cn/articles/2019/09/03/1567504427330.html

本文由博客一文多发渠道 https://openwrite.cn 发布!