• 周一. 6月 24th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

哦,这就是java的优雅停机?(实现及原理)

[db:作者]

1月 4, 2022

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

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

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

Java语言中,我们可以通过

Runtime.getRuntime().addShutdownHook()

方法来注册钩子,以保证程序平滑退出。(其他语言也类似)

来个栗子:


  1. publicclassShutdownGraceFullTest {
  2. /**
  3. * 使用线程池处理任务
  4. */
  5. publicstaticExecutorService executorService = Executors.newCachedThreadPool();
  6. publicstaticvoid main(String[] args) {
  7. //假设有5个线程需要执行任务
  8. for(int i = 0; i < 5; i++){
  9. finalint id = i;
  10. Thread taski = newThread(newRunnable() {
  11. @Override
  12. publicvoid run() {
  13. System.out.println(System.currentTimeMillis() + " : thread_" + id + " start...");
  14. try {
  15. TimeUnit.SECONDS.sleep(id);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println(System.currentTimeMillis() + " : thread_" + id + " finish!");
  20. }
  21. });
  22. taski.setDaemon(true);
  23. executorService.submit(taski);
  24. }
  25. // 添加一个钩子处理未完任务
  26. Runtime.getRuntime().addShutdownHook(newThread(newRunnable() {
  27. @Override
  28. publicvoid run() {
  29. System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No1 shutdown hooking...");
  30. boolean shutdown = true;
  31. try {
  32. executorService.shutdown();
  33. System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " shutdown signal got, wait threadPool finish.");
  34. executorService.awaitTermination(1500, TimeUnit.SECONDS);
  35. System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " all thread's done.");
  36. }
  37. catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No1 shutdown done...");
  41. }
  42. }));
  43. // 多个关闭钩子并发执行
  44. Runtime.getRuntime().addShutdownHook(newThread(newRunnable() {
  45. @Override
  46. publicvoid run() {
  47. try {
  48. System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No2 shutdown hooking...");
  49. Thread.sleep(1000);
  50. } catch (InterruptedException e) {
  51. e.printStackTrace();
  52. }
  53. System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " No2 shutdown done...");
  54. }
  55. }));
  56. System.out.println("main method exit...");
  57. // 故意调用jvm退出命令,发送关闭信号,否则正常情况下 jvm 会等待最后一个非守护线程关闭才会退出
  58. System.exit(0);
  59. }
  60. }

运行结果如下:

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

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


  1. kill -15 pid

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

1、 关闭 socket 链接

2、 清理临时文件

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

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

5、 各种资源的释放

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


  1. kill -9 pid

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

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

要优雅,是代码

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


  1. executorService.shutdown();
  2. 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运行了死循环代码。

出处:https://dwz.cn/nRS7c1Zg

本文分享自微信公众号 –
Java技术江湖(CodingWorld)

原文出处及转载信息见文内详细说明,如有侵权,请联系
[email protected]
删除。

原始发表时间:
2020-12-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

《哦,这就是java的优雅停机?(实现及原理)》有166个想法
  1. Быстромонтируемые строения – это современные системы, которые отличаются большой скоростью возведения и гибкостью. Они представляют собой здания, заключающиеся из эскизно изготовленных составляющих либо узлов, которые способны быть скоро установлены на районе развития.
    Быстровозводимые здания из металлоконструкций стоимость обладают гибкостью также адаптируемостью, что дает возможность просто менять а также переделывать их в соответствии с нуждами клиента. Это экономически выгодное а также экологически стабильное решение, которое в последние лета приобрело маштабное распространение.

  2. Проверьте структуру: Хороший веб-сайт обычно имеет четкую структуру с легким доступом к информации.
    Часть 2: Оценка надежности и авторитетности
    Поиск богатых источников информации важен для нашего всестороннего развития. Определите свои цели, выбирайте надежные и авторитетные источники, разнообразьте свой спектр источников, анализируйте информацию критически и продолжайте учиться. Интернет – это бескрайний мир знаний, и с правильным подходом вы сможете найти бесценные ресурсы для своего развития.
    Путеводитель по выбору сайтов для всестороннего развития: Как найти богатый источник полезной информации
    Новости и журналы: Следите за актуальными новостями и читайте научные и образовательные журналы в вашей области интересов.

    Полезная статья для всех https://telegra.ph/Kak-najti-bogatyj-istochnik-poleznoj-informacii-09-18

    Форумы и обсуждения: Присоединяйтесь к онлайн-сообществам, где можно обсуждать темы, которые вас интересуют, и задавать вопросы экспертам.
    Тщательно анализируйте информацию: Будьте критичными и аналитическими в отношении представленной информации. Проверьте факты и аргументы.
    Современные поисковые системы предоставляют множество инструментов для поиска богатых источников информации. Используйте ключевые слова и фразы, чтобы уточнить результаты поиска.
    Просмотрите обзоры: Читайте обзоры и отзывы других пользователей о веб-сайте. Это может дать вам представление о том, что ожидать.
    Когда вы нашли веб-сайты, соответствующие вашим интересам и надежные с точки зрения авторитетности, оцените качество контента.

  3. Ebay отказывается от PayPal.
    Рынок ценных бумаг можно разделить на первичный и вторичный.
    ОАЭ вложат 600 миллионов долларов в ветровые электростанции Узбекистана.
    Все ценные бумаги, приобретаемые банком, делятся на две группы: первичный и вторичный резерв.
    Платежная матрица показывает, что если Берт принимает решение не инвестировать дополнительные 10 тыс. ф. ст. и Эрни принимает аналогичное решение, то отдача Берта от первоначальных инвестиций составит 4%. Если же Эрни осуществляет инвестиции, в то время как Берт от них отказался, то благодаря наличию положительного внешнего эффекта от действий Эрни норма отдачи от первоначальных инвестиций Берта возрастет до 6%. Таким образом, если Берт не тратит дополнительные 10 тыс. ф. ст., то он получит либо 4, либо 6% в качестве отдачи на первоначальные инвестиции. С другой стороны, если Берт решает потратить дополнительные 10 тыс. ф. ст., в то время как Эрни отказывается от дополнительных инвестиций, то плохое состояние здания Эрни создаст отрицательный внешний эффект для Берта и его норма отдачи снизится до 2%. Наконец, если Эрни инвестирует одновременно с Бертом, то последний получит некоторые положительные внешние выгоды и его норма отдачи от инвестиций составит 5%. Таким образом, если Берт решает инвестировать дополнительные средства, то он получит норму отдачи равную либо 2, либо 5%. Какое решение примет Берт?

    Вашему внимаю интересная статья на тему поиска инормации в интернете https://telegra.ph/Kak-ispolzovat-poiskoviki-dlya-vybora-informacionnogo-sajta-09-28

    18 сентября состоялся деловой вечер-практикум «Вложить: сохранить и увеличить, или Счастье не в деньгах, а в том, как их приумножить», организованный КСК ГРУПП. К участию были приглашены собственники, а также генеральные и финансовые директора среднего и крупного бизнеса.
    По его оценке, наиболее привлекательными отраслями экономики для ФПИ являются банковский сектор, в частности средние и маленькие банки, а также сектор производства строительных материалов с учетом ожидаемого возобновления строительного бума. В Казахстане, говорит Восгиморукян, очень много малых и средних предприятий, которые интересны ФПИ, в частности в индустрии туризма, которая пока слаборазвита. «Интересна отрасль здравоохранения, правительство Казахстана инвестирует в нее миллиарды долларов. К тому же объемы рынка только фармацевтической отрасли составляют $700 млрд., темпы роста — 12%», — подчеркивает он. Также, по его словам, ФПИ проявляют особый интерес к сектору недвижимости. «Мы уже имеем несколько крупных ФПИ, которые специализируются на недвижимости. Они приезжают в Казахстан и рассматривают нынешний период как самый удачный для инвестирования», — сказал Восгиморукян.
    Некоторые ученые не выделяют ликвидность как отдельную инвестиционную цель, так как ликвидность во многом зависит от других основных признаков инвестирования.
    Личные финансы и семейный бюджет.
    При вложении средств в ценные бумаги каждый инвестор стремится к максимальной доходности портфеля, однако доход всегда прямо пропорционален риску, на который готов идти инвестор. Поэтому цель любого инвестора – найти наиболее приемлемое сочетание этих двух факторов.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注