如果一个线程在多线程环境中崩溃,如何关闭JVM?

时间:2016-02-10 16:02:21

标签: java multithreading jvm

我有一个Java程序,在高级别上看起来像这样:

public static void main(final String[] args) {

    Thread t1 = new ComplicatedThread1();
    Thread t2 = new ComplicatedThread2();
    Thread t3 = new ComplicatedThread3();

    t1.start();
    t2.start();
    t3.start();

}

每个线程都包含很多不是我编写的代码。 一个线程中可能有几个子线程。 如果正好一个线程崩溃(即抛出未捕获的运行时异常),则会出现最大的问题。在那种情况下,整个程序仍在运行,但它 发生故障。

现在假设我无法使每个线程变得简单,我想在任何线程崩溃时完全关闭JVM。

问题:如何在任何线程引发的主程序中捕获运行时异常,并要求系统关闭?

1 个答案:

答案 0 :(得分:5)

在主程序的顶部添加几行:

public static void main(final String[] args) {

    // Making sure that if one thread crashes,
    // then the whole JVM will shut down.
    Thread.setDefaultUncaughtExceptionHandler(new Thread.
        UncaughtExceptionHandler() {
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println(t + " throws exception: " + e);
                System.exit(1);
            }
        });

    // Do anything you want from here
    ....
}

这将启动JVM的关闭过程。请注意,某些活动线程可能仍会运行一段时间。