System.exit是不是线程安全的Linux?(System.exit is not threa

2019-08-19 13:09发布

我刚刚从Oracle JDK 1.6,切换到打开JDK 1.7.0_03,我已经打了退出一个相当显着的僵局:

java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 at java.lang.Thread.join(Thread.java:1258)
 - locked <0x8608dda0> (a sun.awt.X11.XToolkit$1$1)
 at java.lang.Thread.join(Thread.java:1332)
 at java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106)
 at java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46)
 at java.lang.Shutdown.runHooks(Shutdown.java:123)
 at java.lang.Shutdown.sequence(Shutdown.java:167)
 at java.lang.Shutdown.exit(Shutdown.java:212)
 - locked <0x8603df28> (a java.lang.Class for java.lang.Shutdown)
 at java.lang.Runtime.exit(Runtime.java:107)
 at java.lang.System.exit(System.java:960)

看来,你必须从AWT事件队列调用System.exit。 这是真的吗? 有没有在阳光下的文档线程需求文档Runtime.exit

我已经打了那里得到的AWT树锁,只需要在Linux上其他令人吃惊的情况,但这个叫绝。 这是一个错误,或者有我只是错过了文档中的东西吗?

Answer 1:

这取决于该runHooks方法将开始通过注册的勾线Runtime.addShutdownHook并等待它们完成。 如果您的勾线被锁定一些AWT事件线程需要太多的资源,它们可能会导致死锁。

如果你必须调用System.exit在AWT事件线程,我建议你把它在另一个线程这样的:

 new Thread(){
            public void run() {
                System.exit(0);
            }
   }.start();


Answer 2:

这是很难说这是否是在运行中的错误不知道更多有关的应用程序在做(理想情况下,这会采取的形式SSCCE )。

例如,下面演示涉及类似死锁System.exit() 。 然而,这显然是在应用程序中的错误,而不是在System.exit()

public class OhNo {

    final static Object lock = new Object();

    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    for (;;) {
                    }
                }
            }
        }).start();
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    System.out.println("in shutdown hook");
                }
            }
        }));
        System.out.println("about to call System.exit()");
        System.exit(0);
    }
}


文章来源: System.exit is not thread-safe on Linux?