如何静默终止带有线程和锁的 Java 程序
How to silently termintate a Java program with threads and locks
例如,在使用系统线程的 C 程序中,我可以通过 Ctrl+C
传递 SIGINT,进程将被静默终止。但是当我对带有线程、锁、信号量等的 Java 程序做同样的事情时,JVM 就停在那里,我必须通过关闭终端或重新启动系统来终止进程 "outside" .当我在运行时看到一些错误行为时,如何让 Java 程序在不关闭终端的情况下静默退出?
您可以向 JVM 添加一个关闭挂钩,该挂钩在收到 SIGINT 时触发,然后在其中调用 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) {
}
}
}
}
}
例如,在使用系统线程的 C 程序中,我可以通过 Ctrl+C
传递 SIGINT,进程将被静默终止。但是当我对带有线程、锁、信号量等的 Java 程序做同样的事情时,JVM 就停在那里,我必须通过关闭终端或重新启动系统来终止进程 "outside" .当我在运行时看到一些错误行为时,如何让 Java 程序在不关闭终端的情况下静默退出?
您可以向 JVM 添加一个关闭挂钩,该挂钩在收到 SIGINT 时触发,然后在其中调用 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) {
}
}
}
}
}