2015-05-01 45 views
0

在使用系統線程的C程序中,例如,我可以通過一個SIGINT與Ctrl+C,並且該進程將被靜默地殺死。但是當我使用線程,鎖,信號等等對Java程序做同樣的事情時,JVM就停在那裏,我必須通過關閉終端或重新啓動系統來終止「外部」進程。當我在運行時看到一些錯誤的行爲時,如何在不關閉終端的情況下以某種方式靜默地退出Java程序?如何靜默使用線程和鎖定termintate Java程序

+0

按Ctrl + C應該工作。按下這些鍵時究竟發生了什麼? – Sebastian

回答

0

您可以向JVM添加一個關閉鉤子,當接收到SIGINT時觸發該JVM,然後在那裏調用Runtime.getRuntime()。halt(0)。這會殺死這個過程。您甚至可以使用Shutdown Hook清除正在運行的線程。

[編輯]我最初的答案是在鉤子中使用System.exit()。但是這不起作用,因爲System.exit會觸發已經運行的鉤子。

你可以用鉤子來試試這個例子,而不是掛鉤。

public class Exit { 

public static void main(String[] args) { 

    Runtime.getRuntime().addShutdownHook(new ExitHok()); 

    Thread t = new Thread(new Printer()); 
    t.start(); 

} 

private static class ExitHok extends Thread { 
    @Override 
    public void run() { 
     System.out.println("Received shutdown"); 
     Runtime.getRuntime().halt(0); 
    } 
} 

private static class Printer implements Runnable { 
    @Override 
    public void run() { 
     int counter = 0; 
     while (true) { 
      System.out.println(++counter); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 
} 

}