2015-05-28 87 views
0

我想在停止時重新啓動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 + Ç會使程序不可見的,在後臺運行。然後我可以通過活動監視器殺死剩餘的進程。如果這個班級收到用戶的輸入,這將是沒有用的。我想知道是否有新的過程與控制檯或類似的東西相關聯。

+1

你檢查:http://stackoverflow.com/questions/1216172/如何可以我攔截ctrlc在一個cli的應用程序? – JonasCz

+0

會話方式:CTRL + C不是規則的例外情況嗎?如果你確實真的想要一個程序關閉,那麼這就是你所使用的,所以如果它再次自動地恢復生機,它會相反的。 – Gimby

+0

_「你檢查了這個:[......]」我沒有。我沒有搜索Ctrl + C,因爲我想要一個更通用的解決方案,這可以用於Ctrl + C和其他最終可能的方式來終止JVM。 @Gimby,我用一個類似的想法問了這個問題:我想知道是否有可能運行一個難以殺死的.jar,因爲到目前爲止我運行的每一個表面上都表現得非常好。 – goncalotomas

回答

1

您可以添加將在有序應用程序關閉期間運行的關閉掛接。你會做它像這樣:

Runtime runtime = Runtime.getRuntime(); 
runtime.addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     // save state before exiting and start again 
     System.out.println("saving..."); 
    } 
}); 

但是,你要注意,這不會涵蓋外部信號殺死進程或JVM否則不以有序的方式關機的情況下。

http://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/signals.html有關JVM上下文中信號主題的討論,您可以專門查看http://en.wikipedia.org/wiki/Unix_signal來討論POSIX信號。請注意,即使你實現本地或Java信號處理程序,有一些無法處理(例如SIGKILL在Linux/Unix的)一些信號

+0

你是什麼意思由外部信號?它是否適用於Ctrl + C?你能詳細說明一下嗎? – goncalotomas

+2

@Aprendiz,是的,它適用於Ctrl + C,並且例如外部信號可以是linux中的「killall -9 java」,或者是「是」,點擊「此應用程序已停止響應,是否要強制關閉它?「或JVM崩潰。 – JonasCz

+0

@Aprendiz http://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/signals.html討論了JVM上下文中的信號主題,您可以查看http:/ /en.wikipedia.org/wiki/Unix_signal專門討論POSIX信號。請注意,即使您實現了native或java信號處理程序,也有一些信號*無法處理(例如,Linux/Unix上的SIGKILL)。 –

相關問題