我想在停止時重新啓動Java應用程序。 這個stackoverflow question地址如何啓動一個Java應用程序。Java應用程序在關閉時如何重新啓動?
是否有可能使程序在關閉時自行重啓?或者在退出之前保存它的狀態?
我的第一種方法是試圖運行一個線程傳遞以下Runnable
實現:
public void run() {
try {
while(true) {
// perform important computations
}
}
catch(Throwable t) {
// save state before exiting and start again
System.out.println("saving...");
}
}
這並沒有工作,因爲當我按下按Ctrl + ç程序不產生輸出,這意味着具有ProcessBuilder
的任何代碼都不會運行。
如果不可能,如何使用其他編程語言或使用操作系統設置(例如UNIX)讓應用程序保持運行狀態(停止關閉和/或在關閉後再次啓動)?
更新:我用pens-fan-69的代碼與ProcessBuilder
實例一起。作爲參考,這裏的代碼看起來:
public class Unkillable {
public static void main(String[] args) {
System.out.println("I'm running!");
Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(new Thread() {
@Override
public void run() {
// save state before exiting and start again
System.out.println("Shuting down...");
ProcessBuilder pb = new ProcessBuilder("java", "Unkillable");
try {
pb.start();
} catch (IOException e) {
System.out.println("Error executing callback function.");
}
}
});
while(true) {
// fancy code goes here
}
}
}
這配備了一個副作用:當你在控制檯上運行此,擊中按Ctrl + Ç會使程序不可見的,在後臺運行。然後我可以通過活動監視器殺死剩餘的進程。如果這個班級收到用戶的輸入,這將是沒有用的。我想知道是否有新的過程與控制檯或類似的東西相關聯。
你檢查:http://stackoverflow.com/questions/1216172/如何可以我攔截ctrlc在一個cli的應用程序? – JonasCz
會話方式:CTRL + C不是規則的例外情況嗎?如果你確實真的想要一個程序關閉,那麼這就是你所使用的,所以如果它再次自動地恢復生機,它會相反的。 – Gimby
_「你檢查了這個:[......]」我沒有。我沒有搜索Ctrl + C,因爲我想要一個更通用的解決方案,這可以用於Ctrl + C和其他最終可能的方式來終止JVM。 @Gimby,我用一個類似的想法問了這個問題:我想知道是否有可能運行一個難以殺死的.jar,因爲到目前爲止我運行的每一個表面上都表現得非常好。 – goncalotomas