gpt4 book ai didi

java - System.exit 在 Linux 上不是线程安全的?

转载 作者:IT王子 更新时间:2023-10-29 00:58:01 26 4
gpt4 key购买 nike

我刚刚从 Oracle JDK 1.6 切换到 Open 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。这是真的吗? Sun 文档中没有线程要求的文档 Runtime.exit

我遇到过其他令人惊讶的情况,其中只有在 Linux 上才需要获取 AWT 树锁,但这个情况很重要。这是一个错误,还是我只是错过了文档中的某些内容?

最佳答案

视情况而定,runHooks 方法将启动任何通过 Runtime.addShutdownHook 注册的钩子(Hook)线程并等待它们完成。如果您的任何钩子(Hook)线程正在锁定 AWT 事件线程也需要的某些资源,它们可能会导致死锁。

如果您必须在 AWT 事件线程中调用 System.exit,我建议您在另一个线程中调用它,例如:

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

关于java - System.exit 在 Linux 上不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15814367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com