關(guān)于Kill指令停掉Java程序的問題
今天同事問我,一個jar包,啟動起來,端口正常,而且防火墻全都關(guān)閉了,為什么前臺訪問出錯?
我第一反應(yīng)是啟動是否正常,然后就是阿里云安全組有沒有配置對應(yīng)的端口。
后來發(fā)現(xiàn)自己也不對,是因為kill -9的問題,所以本文就是來探究kill指令和java的關(guān)閉鉤子
1. Java的原生關(guān)閉鉤子
直接使用這個,不管使用什么方式停止程序,都不會調(diào)用關(guān)閉鉤子,
不知道自己哪里出錯,希望大佬指正。
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關(guān)閉調(diào)試
可以看到,我用IDE點擊運行,然后關(guān)閉,就直接停止了,沒有調(diào)用關(guān)閉鉤子。

1.2 使用kill -15 指令



1.3 使用kill -9 指令


終于有位大佬提出了質(zhì)疑,
說需要把關(guān)閉鉤子注冊方法寫到while循環(huán)上面,
這樣才能注冊成功,于是我就試了一下,
事就這樣成了。
感謝黙塵博主的指導(dǎo)。
修改后代碼:
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環(huán)境,使用kill -15:

在linux環(huán)境,使用kill -9:

2. SpringBoot關(guān)閉鉤子
測試jar包下載地址:
關(guān)閉鉤子測試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關(guān)閉

2.2 使用kill -15 指令

2.3 使用kill -9 指令

所以,如果想優(yōu)雅的關(guān)閉應(yīng)用,需要用kill -15 ,
但是有時候我們會遇到關(guān)閉掉的情況,
那只能用kill -9
參考文獻:
SpringBoot-監(jiān)聽應(yīng)用啟動與關(guān)閉的回調(diào)鉤子
到此這篇關(guān)于Kill指令停掉Java程序的思考的文章就介紹到這了,更多相關(guān)Kill指令停掉Java程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java聯(lián)系人管理系統(tǒng)簡單設(shè)計
這篇文章主要為大家詳細介紹了java聯(lián)系人管理系統(tǒng)簡單設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
Java多線程之ReentrantReadWriteLock源碼解析
這篇文章主要介紹了Java多線程之ReentrantReadWriteLock源碼解析,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-05-05
Java鏈接redis_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java鏈接redis,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

