服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 关于Kill指令停掉Java程序的问题

关于Kill指令停掉Java程序的问题

2022-02-24 12:14Jack魏 Java教程

这篇文章主要介绍了Kill指令停掉Java程序的思考,主要探究kill指令和java的关闭钩子的问题,需要的朋友可以参考下

今天同事问我,一个jar包,启动起来,端口正常,而且防火墙全都关闭了,为什么前台访问出错?
我第一反应是启动是否正常,然后就是阿里云安全组有没有配置对应的端口。
后来发现自己也不对,是因为kill -9的问题,所以本文就是来探究kill指令和java的关闭钩子

 

1. Java的原生关闭钩子

直接使用这个,不管使用什么方式停止程序,都不会调用关闭钩子,
不知道自己哪里出错,希望大佬指正。

public class RunTest {
  public static void main(String[] args) throws InterruptedException {
     int i = 1;
      while (i<10000) {
          System.out.println(i);
          i++;
          Thread.sleep(1000);
      }

      Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
          @Override
          public void run() {
              System.out.println("I'll be back");
          }
      }));
  }
}

1.1 使用IDE关闭调试

可以看到,我用IDE点击运行,然后关闭,就直接停止了,没有调用关闭钩子。

关于Kill指令停掉Java程序的问题

1.2 使用kill -15 指令

关于Kill指令停掉Java程序的问题
关于Kill指令停掉Java程序的问题
关于Kill指令停掉Java程序的问题

1.3 使用kill -9 指令

关于Kill指令停掉Java程序的问题

关于Kill指令停掉Java程序的问题

终于有位大佬提出了质疑,
说需要把关闭钩子注册方法写到while循环上面,
这样才能注册成功,于是我就试了一下,
事就这样成了。
感谢 a尘 博主的指导。

修改后代码:

public class RunTest {
  public static void main(String[] args) throws InterruptedException {

     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
          @Override
          public void run() {
              System.out.println("I'll be back");
          }
      }));
      
     int i = 1;
      while (i<10000) {
          System.out.println(i);
          i++;
          Thread.sleep(1000);
      }
  }
}

这时候用IDE测试,用debug模式停止是正常的:

关于Kill指令停掉Java程序的问题

在linux环境,使用kill -15:

关于Kill指令停掉Java程序的问题

在linux环境,使用kill -9:

关于Kill指令停掉Java程序的问题

 

2. SpringBoot关闭钩子

测试jar包下载地址:
关闭钩子测试jar包

import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class ApplicationListens implements CommandLineRunner, DisposableBean {
  @Override
  public void destroy() throws Exception {
      System.out.println("销毁程序------");
  }

  @Override
  public void run(String... args) throws Exception {
      System.out.println("运行程序------");
  }
}

2.1 使用IDE关闭

关于Kill指令停掉Java程序的问题

2.2 使用kill -15 指令

关于Kill指令停掉Java程序的问题

2.3 使用kill -9 指令

关于Kill指令停掉Java程序的问题

所以,如果想优雅的关闭应用,需要用kill -15 ,
但是有时候我们会遇到关闭掉的情况,
那只能用kill -9

参考文献:
SpringBoot-监听应用启动与关闭的回调钩子

到此这篇关于Kill指令停掉Java程序的思考的文章就介绍到这了,更多相关Kill指令停掉Java程序内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/WeiHao0240/article/details/120849403

延伸 · 阅读

精彩推荐
  • Java教程Java高级特性(基础)

    Java高级特性(基础)

    这篇文章主要介绍了Java高级特性(基础),需要的朋友可以参考下 ...

    Java之家2402020-09-12
  • Java教程解决DataOutputStream乱码的问题

    解决DataOutputStream乱码的问题

    这篇文章主要介绍了DataOutputStream乱码问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    qq_299142296312022-01-06
  • Java教程java中实现递归计算二进制表示中1的个数

    java中实现递归计算二进制表示中1的个数

    这是一个很有意思的问题,是在面试中特别容易被问到的问题之一,解决这个问题第一想法肯定是一位一位的去判断,是1计数器+1,否则不操作,跳到下一位...

    hebedich2542019-12-17
  • Java教程Java设计模式之java观察者模式详解

    Java设计模式之java观察者模式详解

    这篇文章主要介绍了Java经典设计模式之观察者模式,简单分析了观察者模式的概念、原理并结合实例形式给出了java观察者模式的具体用法与相关注意事项...

    大忽悠爱忽悠10502022-01-04
  • Java教程Java编程学习的几个典型实例详解

    Java编程学习的几个典型实例详解

    这篇文章主要给大家介绍了Java编程学习的几个典型实例,其中包括模拟酒店房间管理系统、螺旋矩阵 例或者百鸡问题的变形等经典实例,具体来一起看详...

    chung0011932020-08-19
  • Java教程Java日常练习题,每天进步一点点(47)

    Java日常练习题,每天进步一点点(47)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以...

    牛哄哄的柯南3662021-11-02
  • Java教程浅谈Java面向接口编程

    浅谈Java面向接口编程

    本文通过结合接口的本质、面向对象编程与面向接口编程的关系以及一些作者自身的理解,向大家介绍了面向接口编程的一些东西,需要的朋友可以了解下...

    liuyazhuang6942021-01-06
  • Java教程springmvc学习笔记-返回json的日期格式问题的解决方法

    springmvc学习笔记-返回json的日期格式问题的解决方法

    本篇文章主要介绍了springmvc学习笔记-返回json的日期格式问题的解决方法,解决了日期格式的输出,有兴趣的可以了解一下。...

    Ryan.Miao7182020-07-26