如何静默终止带有线程和锁的 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) {
            }
        }
    }
}

}