今天同事問(wèn)我,一個(gè)jar包,啟動(dòng)起來(lái),端口正常,而且防火墻全都關(guān)閉了,為什么前臺(tái)訪問(wèn)出錯(cuò)?
我第一反應(yīng)是啟動(dòng)是否正常,然后就是阿里云安全組有沒(méi)有配置對(duì)應(yīng)的端口。
后來(lái)發(fā)現(xiàn)自己也不對(duì),是因?yàn)閗ill -9的問(wèn)題,所以本文就是來(lái)探究kill指令和java的關(guān)閉鉤子
1. Java的原生關(guān)閉鉤子
直接使用這個(gè),不管使用什么方式停止程序,都不會(huì)調(diào)用關(guān)閉鉤子,
不知道自己哪里出錯(cuò),希望大佬指正。
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點(diǎn)擊運(yùn)行,然后關(guān)閉,就直接停止了,沒(méi)有調(diào)用關(guān)閉鉤子。
1.2 使用kill -15 指令
1.3 使用kill -9 指令
終于有位大佬提出了質(zhì)疑,
說(shuō)需要把關(guān)閉鉤子注冊(cè)方法寫到while循環(huán)上面,
這樣才能注冊(cè)成功,于是我就試了一下,
事就這樣成了。
感謝 a塵 博主的指導(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); } } }
這時(shí)候用IDE測(cè)試,用debug模式停止是正常的:
在linux環(huán)境,使用kill -15:
在linux環(huán)境,使用kill -9:
2. SpringBoot關(guān)閉鉤子
測(cè)試jar包下載地址:
關(guān)閉鉤子測(cè)試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("運(yùn)行程序------"); } }
2.1 使用IDE關(guān)閉
2.2 使用kill -15 指令
2.3 使用kill -9 指令
所以,如果想優(yōu)雅的關(guān)閉應(yīng)用,需要用kill -15 ,
但是有時(shí)候我們會(huì)遇到關(guān)閉掉的情況,
那只能用kill -9
參考文獻(xiàn):
SpringBoot-監(jiān)聽?wèi)?yīng)用啟動(dòng)與關(guān)閉的回調(diào)鉤子
到此這篇關(guān)于Kill指令停掉Java程序的思考的文章就介紹到這了,更多相關(guān)Kill指令停掉Java程序內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/WeiHao0240/article/details/120849403