0
在使用系統線程的C程序中,例如,我可以通過一個SIGINT與Ctrl+C
,並且該進程將被靜默地殺死。但是當我使用線程,鎖,信號等等對Java程序做同樣的事情時,JVM就停在那裏,我必須通過關閉終端或重新啓動系統來終止「外部」進程。當我在運行時看到一些錯誤的行爲時,如何在不關閉終端的情況下以某種方式靜默地退出Java程序?如何靜默使用線程和鎖定termintate Java程序
在使用系統線程的C程序中,例如,我可以通過一個SIGINT與Ctrl+C
,並且該進程將被靜默地殺死。但是當我使用線程,鎖,信號等等對Java程序做同樣的事情時,JVM就停在那裏,我必須通過關閉終端或重新啓動系統來終止「外部」進程。當我在運行時看到一些錯誤的行爲時,如何在不關閉終端的情況下以某種方式靜默地退出Java程序?如何靜默使用線程和鎖定termintate Java程序
您可以向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) {
}
}
}
}
}
按Ctrl + C應該工作。按下這些鍵時究竟發生了什麼? – Sebastian