gpt4 book ai didi

java - 如何确定我的 Java 应用程序为何拒绝正常终止?

转载 作者:行者123 更新时间:2023-11-29 03:07:16 25 4
gpt4 key购买 nike

我发现在某些情况下,当我关闭 JavaFX 桌面应用程序窗口时 JVM 不会终止。我被迫从 IntelliJ IDEA 中终止进程。

是否有任何工具或程序可用于确定是什么阻碍了应用程序?我尝试从调试 View 中查看正在运行的线程,但没有看到任何明显的东西。

我看到以下线程正在运行:

"pool-4-thread-1@5149" prio=5 tid=0x19 nid=NA waiting
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Unsafe.java:-1)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

"pool-3-thread-1@5126" prio=5 tid=0x18 nid=NA waiting
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Unsafe.java:-1)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

"Prism Font Disposer@3380" daemon prio=10 tid=0x16 nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at com.sun.javafx.font.Disposer.run(Disposer.java:93)
at java.lang.Thread.run(Thread.java:745)

"Thread-1@800" daemon prio=5 tid=0x10 nid=NA waiting
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Unsafe.java:-1)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:492)
at com.sun.glass.ui.InvokeLaterDispatcher.run(InvokeLaterDispatcher.java:108)

"AWT-Windows@5905" daemon prio=6 tid=0x1c nid=NA runnable
java.lang.Thread.State: RUNNABLE
at sun.awt.windows.WToolkit.eventLoop(WToolkit.java:-1)
at sun.awt.windows.WToolkit.run(WToolkit.java:306)
at java.lang.Thread.run(Thread.java:745)

"Java2D Disposer@5290" daemon prio=10 tid=0x1a nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at sun.java2d.Disposer.run(Disposer.java:148)
at java.lang.Thread.run(Thread.java:745)

"Finalizer@428" daemon prio=8 tid=0x3 nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler@429" daemon prio=10 tid=0x2 nid=NA waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)

"DestroyJavaVM@6048" prio=5 tid=0x1f nid=NA runnable
java.lang.Thread.State: RUNNABLE

"Thread-2@900" daemon prio=5 tid=0x12 nid=NA runnable
java.lang.Thread.State: RUNNABLE

"Attach Listener@426" daemon prio=5 tid=0x5 nid=NA runnable
java.lang.Thread.State: RUNNABLE

"Signal Dispatcher@427" daemon prio=9 tid=0x4 nid=NA runnable
java.lang.Thread.State: RUNNABLE

最佳答案

当唯一保持运行的用户线程是守护进程 线程时,JVM 将终止。查看您的线程转储,我们可以看到两个非守护线程的线程仍在运行:

"pool-4-thread-1@5149" prio=5 tid=0x19 nid=NA waiting
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Unsafe.java:-1)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
...

"pool-3-thread-1@5126" prio=5 tid=0x18 nid=NA waiting
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Unsafe.java:-1)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
...

这些线程可防止您的 JVM 终止。

从名称来看,它们可能是从您代码中的线程池生成的。因为它们在等待,所以它们只是您池中的空闲线程。有几个选项可以确保这些线程不会阻止 JVM 终止:

  1. 在您的线程池(或 Executor 或您正在使用的任何接口(interface))上调用 shutdown()
  2. 使用您自己的线程工厂创建线程池,将线程设置为守护进程线程。
  3. 配置线程池以允许线程超时并自动销毁。

关于java - 如何确定我的 Java 应用程序为何拒绝正常终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524536/

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