要讓一個(gè)java程序自動(dòng)重啟還真不容易的,重啟分兩步,首先是結(jié)束程序,這個(gè)簡(jiǎn)單,只要運(yùn)行System.exit()就可以了。然后是啟動(dòng),這個(gè)就難了,這個(gè)時(shí)候程序都已經(jīng)結(jié)束了,就像一個(gè)人死了就不可能再自己站起來(lái),怎么辦呢?讓別人幫他扶起來(lái),幸運(yùn)的是,我也有這樣的條件,我要重啟的那個(gè)程序并不孤獨(dú),還有另一個(gè)java程序和它一起在運(yùn)行,我只要讓運(yùn)行著的那個(gè)程序來(lái)啟動(dòng)它就可以了。
但運(yùn)行著的那個(gè)程序它怎么知道要關(guān)閉的那個(gè)程序在什么時(shí)候關(guān)閉呢,如果不知道就不能貿(mào)然啟動(dòng)。只有讓要關(guān)閉的那個(gè)程序在自殺前先通知一下了,就是發(fā)個(gè)信息給運(yùn)行著的那個(gè)程序,告訴它,我要自殺了,你準(zhǔn)備重啟我吧。好了,這個(gè)也解決了,可以重啟了。
但第二個(gè)問(wèn)題又來(lái)了,怎么啟動(dòng)呢,一般java程序都是用批處理來(lái)啟動(dòng)的,但在程序里像這樣調(diào)用批處理文件卻行不通:
1
2
3
4
5
6
7
8
|
try { Runtime.getRuntime().exec( "要啟動(dòng)的批處理.bat" ); } catch (Exception e) { e.printStackTrace(); } |
在java程序里只能調(diào)用可執(zhí)行程序來(lái)運(yùn)行,批處理是不能運(yùn)行的。怎么辦?沒(méi)辦法了嗎?找到一個(gè)軟件VisualBat,用它把批處理編譯成可執(zhí)行程序,這樣就可以了。
好了,現(xiàn)在可以關(guān)閉,也可以啟動(dòng)了,但還有一個(gè)問(wèn)題:我要一天啟動(dòng)一次而且還要在下午5點(diǎn)時(shí)重啟,這個(gè)要考慮一下了,最后這樣做,用兩個(gè)變量,一個(gè)記下程序啟動(dòng)時(shí)的日期,一個(gè)記下當(dāng)前是幾點(diǎn),只要所記的日期不是今天而且現(xiàn)在又是5點(diǎn),就可以重啟了。
本以為完成了,但程序閃了一下就不見了。仔細(xì)想了一下,可能結(jié)束程序與啟動(dòng)程序間隔時(shí)間太短了,舊程序還沒(méi)有完全釋放端口,新程序就來(lái)?yè)尪丝诹耍捎谛鲁绦驔](méi)搶到端口,于是就自己關(guān)閉了。這個(gè)也簡(jiǎn)單,只要在啟動(dòng)前先等一等,Thread.sleep(5000) ,等上5秒,讓端口完全釋放,這時(shí)再啟動(dòng)就可以了。確實(shí)如此,這個(gè)問(wèn)題就這樣解決了。
以上這篇讓Java程序自動(dòng)重啟的實(shí)現(xiàn)方法(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。