關於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點擊運行,然後關閉,就直接停止瞭,沒有調用關閉鉤子。

在這裡插入圖片描述

1.2 使用kill -15 指令

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

1.3 使用kill -9 指令

在這裡插入圖片描述

在這裡插入圖片描述

終於有位大佬提出瞭質疑,
說需要把關閉鉤子註冊方法寫到while循環上面,
這樣才能註冊成功,於是我就試瞭一下,
事就這樣成瞭。
感謝 黙塵 博主的指導。

修改後代碼:

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模式停止是正常的:

在這裡插入圖片描述

在linux環境,使用kill -15:

在這裡插入圖片描述

在linux環境,使用kill -9:

在這裡插入圖片描述

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關閉

在這裡插入圖片描述

2.2 使用kill -15 指令

在這裡插入圖片描述

2.3 使用kill -9 指令

在這裡插入圖片描述

所以,如果想優雅的關閉應用,需要用kill -15
但是有時候我們會遇到關閉掉的情況,
那隻能用kill -9

參考文獻:
SpringBoot-監聽應用啟動與關閉的回調鉤子

到此這篇關於Kill指令停掉Java程序的思考的文章就介紹到這瞭,更多相關Kill指令停掉Java程序內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: