我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java优雅停机的实现及原理是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java优雅停机的实现及原理是什么

这篇文章给大家介绍Java优雅停机的实现及原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

优雅停机? 这个名词我是服的,如果抛开专业不谈,多好的名词啊!

其实优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做好一些善后操作,比如:关闭线程、释放连接资源等。

再比如,就是不会让调用方的请求处理了一增,一下就中断了。而处理完本次后,再停止服务。

Java语言中,我们可以通过Runtime.getRuntime().addShutdownHook()方法来注册钩子,以保证程序平滑退出。(其他语言也类似)

来个栗子:

public class ShutdownGraceFullTest {           public static ExecutorService executorService = Executors.newCachedThreadPool();      public static void main(String[] args) {          //假设有5个线程需要执行任务         for(int i = 0; i < 5; i++){             final int id = i;             Thread taski = new Thread(new Runnable() {                 @Override                 public void run() {                     System.out.println(System.currentTimeMillis() + " : thread_" + id + " start...");                     try {                         TimeUnit.SECONDS.sleep(id);                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                     System.out.println(System.currentTimeMillis() + " : thread_" + id + " finish!");                 }             });             taski.setDaemon(true);             executorService.submit(taski);         }          // 添加一个钩子处理未完任务         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {             @Override             public void run() {                  System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No1 shutdown hooking...");                 boolean shutdown = true;                 try {                     executorService.shutdown();                     System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() +  " shutdown signal got, wait threadPool finish.");                     executorService.awaitTermination(1500, TimeUnit.SECONDS);                     System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() +  " all thread's done.");                 }                 catch (InterruptedException e) {                     e.printStackTrace();                 }                 System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No1 shutdown done...");             }         }));          // 多个关闭钩子并发执行         Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {             @Override             public void run() {                 try {                     System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No2 shutdown hooking...");                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                 System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No2 shutdown done...");             }         }));          System.out.println("main method exit...");         // 故意调用jvm退出命令,发送关闭信号,否则正常情况下 jvm 会等待***一个非守护线程关闭才会退出         System.exit(0);     } }

运行结果如下:

Java优雅停机的实现及原理是什么

很明显,确实是优雅了,虽然***收到了一关闭信号,但是仍然保证了任务的处理完成。很棒吧!

那么,在实际应用中是如何体现优雅停机呢?

kill -15 pid

通过该命令发送一个关闭信号给到jvm, 然后就开始执行 Shutdown Hook 了,你可以做很多:

  1. 关闭 socket 链接

  2. 清理临时文件

  3. 发送消息通知给订阅方,告知自己下线

  4. 将自己将要被销毁的消息通知给子进程

  5. 各种资源的释放

而在平时工作中,我们不乏看到很多运维同学,是这么干的:

kill -9 pid

如果这么干的话,jvm也无法了,kill -9 相当于一次系统宕机,系统断电。这会给应用杀了个措手不及,没有留给应用任何反应的机会。

所以,无论如何是优雅不起来了。

要优雅,是代码

其中,线程池的关闭方式为:

executorService.shutdown();  executorService.awaitTermination(1500, TimeUnit.SECONDS);

ThreadPoolExecutor 在 shutdown 之后会变成 SHUTDOWN  状态,无法接受新的任务,随后等待正在执行的任务执行完成。意味着,shutdown 只是发出一个命令,至于有没有关闭还是得看线程自己。

ThreadPoolExecutor 对于 shutdownNow 的处理则不太一样,方法执行之后变成 STOP 状态,并对执行中的线程调用  Thread.interrupt() 方法(但如果线程未处理中断,则不会有任何事发生),所以并不代表“立刻关闭”。

shutdown()  :启动顺序关闭,其中执行先前提交的任务,但不接受新任务。如果已经关闭,则调用没有附加效果。此方法不等待先前提交的任务完成执行。

shutdownNow():尝试停止所有正在执行的任务,停止等待任务的处理,并返回正在等待执行的任务的列表。当从此方法返回时,这些任务将从任务队列中耗尽(删除)。此方法不等待主动执行的任务终止。

executor.awaitTermination(this.awaitTerminationSeconds, TimeUnit.SECONDS));  控制等待的时间,防止任务***期的运行(前面已经强调过了,即使是 shutdownNow 也不能保证线程一定停止运行)。

注意:

  • 虚拟机会对多个shutdownhook以未知的顺序调用,都执行完后再退出。

  • 如果接收到 kill -15 pid 命令时,执行阻塞操作,可以做到等待任务执行完成之后再关闭 JVM。同时,也解释了一些应用执行 kill -15  pid 无法退出的问题,如:中断被阻塞了,或者hook运行了死循环代码。

关于Java优雅停机的实现及原理是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java优雅停机的实现及原理是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java优雅停机的实现及原理是什么

这篇文章给大家介绍Java优雅停机的实现及原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。优雅停机? 这个名词我是服的,如果抛开专业不谈,多好的名词啊!其实优雅停机,就是在要关闭服务之前,不是立马全部关停,而是
2023-06-17

java反射机制的实现原理是什么

Java反射机制是指在运行状态中,对任意一个类都能够知道这个类的所有属性和方法,对任意一个对象都能够调用它的任意一个方法。实现Java反射机制的原理主要涉及以下几个方面:1. 类装载器:Java反射机制通过类装载器加载指定的类,并生成对应的
2023-08-08

Java动态代理的原理及实现方法是什么

本篇内容主要讲解“Java动态代理的原理及实现方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java动态代理的原理及实现方法是什么”吧!代理是指:某些场景下对象会找一个代理对象,来辅助
2023-07-02

Java AQS的实现原理是什么

这篇文章主要介绍“Java AQS的实现原理是什么”,在日常操作中,相信很多人在Java AQS的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java AQS的实现原理是什么”的疑惑有所帮助!
2023-07-05

java lock的实现原理是什么

Java中的锁(Lock)是一种同步机制,用于控制多个线程对共享资源的访问。锁的主要作用是确保在同一时刻只有一个线程能够访问某个共享资源,从而防止数据竞争和线程安全问题的发生。Java中的锁主要有两种实现原理:内置锁(synchronize
2023-10-20

java原子类实现的原理是什么

Java原子类的实现原理是利用了底层的CAS(Compare and Swap)操作。CAS是一种乐观锁机制,它包含三个参数:内存位置V,旧的预期值A和新的值B。CAS操作首先将内存位置V的值与预期值A进行比较,如果相等,则将内存位置V的值
2023-10-18

Java中实现随机数算法的原理是什么

本篇文章为大家展示了Java中实现随机数算法的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。软件实现的算法都是伪随机算法,随机种子一般是系统时间在数论中,线性同余方程是最基本的同余方程,“
2023-05-31

java多态实现的原理是什么

Java多态的实现原理是通过方法的重写和方法的动态绑定实现的。多态是指同一个方法在不同的对象上可以有不同的表现形式。在Java中,一个父类可以有多个子类。当一个方法被子类重写时,子类对象调用该方法时会优先调用自己的实现。而在编译时,编译器无
2023-09-22

Java中​HashMap的工作原理及实现方法是什么

今天小编给大家分享一下Java中HashMap的工作原理及实现方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Has
2023-06-03

Java NIO Buffer实现原理是什么

本篇内容介绍了“Java NIO Buffer实现原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、Buffer的继承体系如上图所
2023-06-21

Java线程池实现原理是什么及怎么使用

这篇文章主要讲解了“Java线程池实现原理是什么及怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程池实现原理是什么及怎么使用”吧!1. 为什么要使用线程池使用线程池通常由以
2023-07-04

java动态代理实现的原理是什么

Java动态代理是指在运行时动态生成代理类的技术。它的实现原理主要涉及两个关键组件:接口和InvocationHandler。1. 接口:代理类需要实现一个接口,该接口定义了将要被代理对象的方法。2. InvocationHandler:I
2023-09-09

Java实现读写锁的原理是什么

本文小编为大家详细介绍“Java实现读写锁的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现读写锁的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。读/写锁Java实现首先我们总结一
2023-06-29

java中实现多态的原理是什么

什么是多态?多态就是指一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用
java中实现多态的原理是什么
2020-11-11

java迭代器实现的原理是什么

Java迭代器的实现原理是基于设计模式中的迭代器模式。迭代器模式是一种行为型模式,它提供了一种方法来顺序访问一个聚合对象中的元素,而不需要暴露该对象的内部表示。在Java中,迭代器通过实现Iterator接口来实现。Iterator接口包含
2023-10-10

java 中集合的实现原理是什么

本篇文章给大家分享的是有关java 中集合的实现原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、HashMappublic class HashMapDemo {
2023-06-20

java懒加载的实现原理是什么

Java的懒加载(Lazy Loading)是一种延迟加载的策略,即在需要使用某个对象时才进行实例化和初始化,在之前不会占用额外的资源。懒加载的实现原理主要通过使用单例模式和双重检查锁定(Double-Checked Locking)来实现
2023-09-14

Java RMI机制的原理是什么

本篇内容主要讲解“Java RMI机制的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java RMI机制的原理是什么”吧!Java RMIJava RMI之HelloWorld篇Ja
2023-06-20

SpringAop实现原理及代理模式是什么

这篇文章主要介绍了SpringAop实现原理及代理模式是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringAop实现原理及代理模式是什么文章都会有所收获,下面我们一起来看看吧。Spring Aop的
2023-06-29

Java线程池实现原理是什么

这篇文章主要讲解了“Java线程池实现原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程池实现原理是什么”吧!一、线程池参数1、corePoolSize(必填):核心线程数
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录