Java Swing 1.6 更新 23 个使用 Applet 的 JVM 锁

Posted

技术标签:

【中文标题】Java Swing 1.6 更新 23 个使用 Applet 的 JVM 锁【英文标题】:Java Swing 1.6 update 23 JVM Locks using Applet 【发布时间】:2011-09-05 10:48:04 【问题描述】:

我目前有一个小程序,但最近才发现它存在问题,有时整个 JVM 会锁定并变得无响应,包括 Java 控制台。

Applet 中用于更新 UI 的任何代码都在事件调度线程上运行。 当 JVM 锁定时,我使用 JVisualVM 来提供 JVM 的线程转储。我将输出附在下面。从我看到的是有 3 个 Event Queues,但更令人担忧的是,我认为有 2 个 EventDispatch 线程在运行,并且在一个致命的拥抱中相互阻塞。

小程序中的场景如下,用户希望在文本字段上浏览,因此我们启动托管在 JInternalFrame 窗口中的浏览窗口,用户选择他们想要的值,然后将该值插入到 TextField 和浏览窗口被关闭。

据我所知,线程 AWT-EventQueue-2 正在更新 EDT 上的字段,并已获取 javax.swing.text.AbstractDocument.replace() 中的 writeLock 并尝试使文本字段无效,但一直等到线程AWT-EventQueue-0 释放 Treelock,但是 AWT-EventQueue-0 正在等待同一字段上的 readlock() 但不会继续进行,直到线程 AWT-EventQueue-2 释放 writelock,因此相互锁定。 我不明白的是,似乎至少有 2 个 EDT。

我知道我在这里可能很愚蠢,但任何人都可以阐明这个问题。提前致谢。

我的问题是,你认为这是一个 JVM 错误

这里感兴趣的线程是 AWT-EventQueue-1、AWT-EventQueue-2 和 AWT-EventQueue-0。

2011-05-26 12:32:43 全线程转储 Java HotSpot(TM) 客户端 VM(19.0-b09 混合模式,共享): “JMX 服务器连接超时 1480”守护进程 prio=6 tid=0x048d0800 nid=0xbac in Object.wait() [0x056ef000] java.lang.Thread.State:TIMED_WAITING(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(未知来源) - 锁定(a [I) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “RMI Scheduler(0)”守护进程prio=6 tid=0x04a72800 nid=0xf74 等待条件[0x047cf000] java.lang.Thread.State:TIMED_WAITING(停车) 在 sun.misc.Unsafe.park(本机方法) - 停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 在 java.util.concurrent.locks.LockSupport.parkNanos(未知来源) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(未知来源) 在 java.util.concurrent.DelayQueue.take(未知来源) 在 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(未知来源) 在 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(未知来源) 在 java.util.concurrent.ThreadPoolExecutor.getTask(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “RMI TCP Connection(2)-172.16.10.136”守护进程prio=6 tid=0x0494c800 nid=0x7b8 可运行[0x0462f000] java.lang.Thread.State:可运行 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(未知来源) 在 java.io.BufferedInputStream.fill(未知来源) 在 java.io.BufferedInputStream.read(未知来源) - 锁定(一个 java.io.BufferedInputStream) 在 java.io.FilterInputStream.read(未知来源) 在 sun.rmi.transport.tcp.TCPTransport.handleMessages(未知来源) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(未知来源) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.runTask(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: -(一个 java.util.concurrent.locks.ReentrantLock$NonfairSync) “RMI TCP Accept-0”守护进程prio=6 tid=0x050b0400 nid=0x860 可运行[0x036df000] java.lang.Thread.State:可运行 在 java.net.PlainSocketImpl.socketAccept(本机方法) 在 java.net.PlainSocketImpl.accept(未知来源) - 锁定(一个 java.net.SocksSocketImpl) 在 java.net.ServerSocket.implAccept(未知来源) 在 java.net.ServerSocket.accept(未知来源) 在 sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(未知来源) 在 sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(未知来源) 在 sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(未知来源) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “NativeSwing 接收器 - Swing”守护进程 prio=4 tid=0x04aafc00 nid=0x164 可运行 [0x0471f000] java.lang.Thread.State:可运行 在 java.net.SocketInputStream.socketRead0(本机方法) 在 java.net.SocketInputStream.read(未知来源) 在 java.io.BufferedInputStream.fill(未知来源) 在 java.io.BufferedInputStream.read(未知来源) - 锁定(一个 java.io.BufferedInputStream) 在 java.io.ObjectInputStream$PeekInputStream.peek(未知来源) 在 java.io.ObjectInputStream$BlockDataInputStream.peek(未知来源) 在 java.io.ObjectInputStream$BlockDataInputStream.peekByte(未知来源) 在 java.io.ObjectInputStream.readObject0(未知来源) 在 java.io.ObjectInputStream.readUnshared(未知来源) 在 chrriis.dj.nativeswing.swtimpl.OutProcessSocketsMessagingInterface.readMessageFromChannel(OutProcessSocketsMessagingInterface.java:113) 在 chrriis.dj.nativeswing.swtimpl.MessagingInterface$2.run(MessagingInterface.java:361) 锁定的可拥有同步器: - 没有 “NativeSwing 流连接器”守护进程 prio=4 tid=0x04915800 nid=0xf04 可运行 [0x0569f000] java.lang.Thread.State:可运行 在 java.io.FileInputStream.readBytes(本机方法) 在 java.io.FileInputStream.read(未知来源) 在 java.io.BufferedInputStream.fill(未知来源) 在 java.io.BufferedInputStream.read1(未知来源) 在 java.io.BufferedInputStream.read(未知来源) - 锁定(一个 java.io.BufferedInputStream) 在 java.io.FilterInputStream.read(未知来源) 在 chrriis.dj.nativeswing.swtimpl.NativeInterface$OutProcess$1.run(NativeInterface.java:801) 锁定的可拥有同步器: - 没有 “NativeSwing 流连接器”守护进程 prio=4 tid=0x03330400 nid=0xe24 可运行 [0x0564f000] java.lang.Thread.State:可运行 在 java.io.FileInputStream.readBytes(本机方法) 在 java.io.FileInputStream.read(未知来源) 在 java.io.BufferedInputStream.read1(未知来源) 在 java.io.BufferedInputStream.read(未知来源) - 锁定(一个 java.io.BufferedInputStream) 在 java.io.BufferedInputStream.fill(未知来源) 在 java.io.BufferedInputStream.read1(未知来源) 在 java.io.BufferedInputStream.read(未知来源) - 锁定(一个 java.io.BufferedInputStream) 在 java.io.FilterInputStream.read(未知来源) 在 chrriis.dj.nativeswing.swtimpl.NativeInterface$OutProcess$1.run(NativeInterface.java:801) 锁定的可拥有同步器: - 没有 “WebServer”守护进程prio=4 tid=0x0489b400 nid=0xfc8 可运行[0x055ff000] java.lang.Thread.State:可运行 在 java.net.PlainSocketImpl.socketAccept(本机方法) 在 java.net.PlainSocketImpl.accept(未知来源) - 锁定(一个 java.net.SocksSocketImpl) 在 java.net.ServerSocket.implAccept(未知来源) 在 java.net.ServerSocket.accept(未知来源) 在 chriis.common.WebServer$1.run(WebServer.java:720) 锁定的可拥有同步器: - 没有 “注册表清理线程”守护进程 prio=4 tid=0x04ad9400 nid=0xf94 等待条件 [0x055af000] java.lang.Thread.State: TIMED_WAITING (睡眠) 在 java.lang.Thread.sleep(本机方法) 在 chrriis.common.ObjectRegistry$1.run(ObjectRegistry.java:31) 锁定的可拥有同步器: - 没有 “注册表清理线程”守护进程 prio=4 tid=0x04c37400 nid=0x2e4 等待条件 [0x054df000] java.lang.Thread.State: TIMED_WAITING (睡眠) 在 java.lang.Thread.sleep(本机方法) 在 chrriis.common.ObjectRegistry$1.run(ObjectRegistry.java:31) 锁定的可拥有同步器: - 没有 “TimerQueue”守护进程prio=4 tid=0x03378000 nid=0xa0 in Object.wait() [0x0486f000] java.lang.Thread.State:TIMED_WAITING(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 javax.swing.TimerQueue.run(未知来源) - 锁定(javax.swing.TimerQueue) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “ConsoleWriterThread”守护进程prio=6 tid=0x032b1400 nid=0x398 in Object.wait() [0x0476f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.Object.wait(Object.java:485) 在 com.sun.deploy.util.ConsoleTraceListener$ConsoleWriterThread.run(未知来源) - 锁定(一个 java.lang.Object) 锁定的可拥有同步器: - 没有 “Windows 托盘图标线程”prio=6 tid=0x032a7800 nid=0xdbc 可运行 [0x046cf000] java.lang.Thread.State:可运行 在 com.sun.deploy.ui.WindowsJavaTrayIcon.mainLoop(本机方法) 在 com.sun.deploy.ui.WindowsJavaTrayIcon.access$700(未知来源) 在 com.sun.deploy.ui.WindowsJavaTrayIcon$2.run(未知来源) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “TimerQueue”守护进程prio=6 tid=0x032a2800 nid=0xf78 in Object.wait() [0x0467f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) - 等待(javax.swing.TimerQueue) 在 javax.swing.TimerQueue.run(未知来源) - 锁定(javax.swing.TimerQueue) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “线程小程序-ClientApplet.class-1”prio=4 tid=0x03281400 nid=0x85c in Object.wait() [0x045df000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) - 等待(java.lang.Object) 在 java.lang.Object.wait(Object.java:485) 在 sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(未知来源) - 锁定(一个 java.lang.Object) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “AWT-EventQueue-1”prio=6 tid=0x0325b400 nid=0xe94 等待监视器条目 [0x0457f000] java.lang.Thread.State: BLOCKED (在对象监视器上) 在 javax.swing.JComponent.paintChildren(未知来源) - 等待锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintToOffscreen(未知来源) 在 javax.swing.BufferStrategyPaintManager.paint(未知来源) 在 javax.swing.RepaintManager.paint(未知来源) 在 javax.swing.JComponent._paintImmediately(未知来源) 在 javax.swing.JComponent.paintImmediately(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.seqPaintDirtyRegions(未知来源) 在 javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(未知来源) 在 java.awt.event.InvocationEvent.dispatch(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源) 锁定的可拥有同步器: - 没有 “AWT-EventQueue-2”prio=4 tid=0x03259800 nid=0xb0c 等待监视器条目 [0x0363f000] java.lang.Thread.State: BLOCKED (在对象监视器上) 在 java.awt.Component.invalidate(未知来源) - 等待锁定(java.awt.Component$AWTTreeLock) 在 java.awt.Container.invalidate(未知来源) 在 javax.swing.JComponent.revalidate(未知来源) 在 javax.swing.plaf.basic.BasicTextUI$RootView.preferenceChanged(未知来源) 在 javax.swing.text.View.preferenceChanged(未知来源) 在 javax.swing.text.PlainView.updateDamage(未知来源) 在 javax.swing.text.PlainView.removeUpdate(未知来源) 在 javax.swing.text.FieldView.removeUpdate(未知来源) 在 javax.swing.plaf.basic.BasicTextUI$RootView.removeUpdate(未知来源) 在 javax.swing.plaf.basic.BasicTextUI$UpdateHandler.removeUpdate(未知来源) 在 javax.swing.text.AbstractDocument.fireRemoveUpdate(未知来源) 在 javax.swing.text.AbstractDocument.handleRemove(未知来源) 在 javax.swing.text.AbstractDocument.remove(未知来源) 在 javax.swing.text.AbstractDocument.replace(未知来源) 在 javax.swing.text.JTextComponent.setText(未知来源) 在 JCFTextField.setFieldData(未知来源) 在 JCFTextField.JC_setData(未知来源) 在 CTetraAppCommsCallBack.JC_SetData(未知来源) 在 ClientCommsManager.processComponentMsg(未知来源) 在 ClientCommsManager.commsInput(未知来源) 在 HTTPCommsThread$2.run(未知来源) 在 java.awt.event.InvocationEvent.dispatch(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源) 锁定的可拥有同步器: - 没有 “Applet 1 LiveConnect 工作线程”prio=4 tid=0x03261800 nid=0xe3c in Object.wait() [0x044df000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.Object.wait(Object.java:485) 在 sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(未知来源) - 锁定(一个 java.lang.Object) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “浏览器端对象清理线程”prio=6 tid=0x03255800 nid=0x29c in Object.wait() [0x037ff000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) - 等待(java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(未知来源) - 锁定(java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(未知来源) 在 sun.plugin2.main.client.LiveConnectSupport$BrowserSideObjectCleanupThread.run(未知来源) 锁定的可拥有同步器: - 没有 “CacheCleanUpThread”守护进程prio=6 tid=0x0322d000 nid=0x86c in Object.wait() [0x0377f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) - 等待(com.sun.deploy.cache.CleanupThread) 在 java.lang.Object.wait(Object.java:485) 在 com.sun.deploy.cache.CleanupThread.run(未知来源) - 锁定(com.sun.deploy.cache.CleanupThread) 锁定的可拥有同步器: - 没有 “CacheMemoryCleanUpThread”守护进程prio=6 tid=0x03227c00 nid=0x554 in Object.wait() [0x0372f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.ref.ReferenceQueue.remove(未知来源) - 锁定(java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(未知来源) 在 com.sun.deploy.cache.MemoryCache$LoadedResourceCleanupThread.run(未知来源) 锁定的可拥有同步器: - 没有 “Java 插件心跳线程”prio=6 tid=0x02d66c00 nid=0xdcc 等待条件 [0x034af000] java.lang.Thread.State: TIMED_WAITING (睡眠) 在 java.lang.Thread.sleep(本机方法) 在 sun.plugin2.main.client.PluginMain$HeartbeatThread.run(未知来源) 锁定的可拥有同步器: - 没有 “AWT-EventQueue-0”prio=6 tid=0x02d6e400 nid=0xd9c in Object.wait() [0x0368d000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.Object.wait(Object.java:485) 在 javax.swing.text.AbstractDocument.readLock(未知来源) - 锁定(javax.swing.text.PlainDocument) 在 javax.swing.plaf.basic.BasicTextUI.paint(未知来源) 在 javax.swing.plaf.basic.BasicTextUI.update(未知来源) 在 javax.swing.JComponent.paintComponent(未知来源) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JLayeredPane.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JLayeredPane.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JLayeredPane.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JViewport.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JLayeredPane.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JLayeredPane.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JSplitPane.paintChildren(未知来源) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintChildren(未知来源) - 锁定(java.awt.Component$AWTTreeLock) 在 javax.swing.JComponent.paint(未知来源) 在 javax.swing.JComponent.paintToOffscreen(未知来源) 在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(未知来源) 在 javax.swing.RepaintManager$PaintManager.paint(未知来源) 在 javax.swing.BufferStrategyPaintManager.paint(未知来源) 在 javax.swing.RepaintManager.paint(未知来源) 在 javax.swing.JComponent._paintImmediately(未知来源) 在 javax.swing.JComponent.paintImmediately(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.paintDirtyRegions(未知来源) 在 javax.swing.RepaintManager.seqPaintDirtyRegions(未知来源) 在 javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(未知来源) 在 java.awt.event.InvocationEvent.dispatch(未知来源) 在 java.awt.EventQueue.dispatchEvent(未知来源) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.run(未知来源) 锁定的可拥有同步器: - 没有 “AWT-Windows”守护进程prio=6 tid=0x02cea800 nid=0x568 可运行[0x00a2f000] java.lang.Thread.State:可运行 在 sun.awt.windows.WToolkit.eventLoop(本机方法) 在 sun.awt.windows.WToolkit.run(未知来源) 锁定的可拥有同步器: - 没有 Object.wait() [0x0359f000] 中的“AWT-关闭”prio=6 tid=0x02ce9c00 nid=0x608 java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.Object.wait(Object.java:485) 在 sun.awt.AWTAutoShutdown.run(未知来源) - 锁定(一个 java.lang.Object) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “Java2D Disposer”守护进程 prio=10 tid=0x02ccb800 nid=0x524 in Object.wait() [0x0354f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.ref.ReferenceQueue.remove(未知来源) - 锁定(java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(未知来源) 在 sun.java2d.Disposer.run(未知来源) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “Java 插件管道工作线程(客户端)”守护进程 prio=6 tid=0x0321c400 nid=0xbec 可运行 [0x034ff000] java.lang.Thread.State:可运行 在 sun.plugin2.os.windows.Windows.ReadFile0(本机方法) 在 sun.plugin2.os.windows.Windows.ReadFile(未知来源) 在 sun.plugin2.ipc.windows.WindowsNamedPipe.read(未知来源) 在 sun.plugin2.message.transport.NamedPipeTransport$SerializerImpl.read(未知来源) 在 sun.plugin2.message.transport.NamedPipeTransport$SerializerImpl.readByte(未知来源) 在 sun.plugin2.message.AbstractSerializer.readInt(未知来源) 在 sun.plugin2.message.transport.SerializingTransport.read(未知来源) 在 sun.plugin2.message.Pipe$WorkerThread.run(未知来源) 锁定的可拥有同步器: - 没有 “Timer-0”prio=6 tid=0x02d65c00 nid=0x4e8 in Object.wait() [0x0345f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) - 等待(java.util.TaskQueue) 在 java.lang.Object.wait(Object.java:485) 在 java.util.TimerThread.mainLoop(未知来源) - 锁定(一个 java.util.TaskQueue) 在 java.util.TimerThread.run(未知来源) 锁定的可拥有同步器: - 没有 “traceMsgQueueThread”守护进程prio=6 tid=0x02cef400 nid=0xb14 in Object.wait() [0x031cf000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.Object.wait(Object.java:485) 在 com.sun.deploy.util.Trace$TraceMsgQueueChecker.run(未知来源) - 锁定(一个 java.util.ArrayList) 在 java.lang.Thread.run(未知来源) 锁定的可拥有同步器: - 没有 “低内存检测器”守护进程 prio=6 tid=0x02c9e400 nid=0x834 可运行 [0x00000000] java.lang.Thread.State:可运行 锁定的可拥有同步器: - 没有 “CompilerThread0”守护进程prio=10 tid=0x02c98800 nid=0xf0c 等待条件[0x00000000] java.lang.Thread.State:可运行 锁定的可拥有同步器: - 没有 “附加侦听器”守护进程 prio=10 tid=0x02c96c00 nid=0xec 等待条件 [0x00000000] java.lang.Thread.State:可运行 锁定的可拥有同步器: - 没有 “信号调度程序”守护进程 prio=10 tid=0x02c95800 nid=0x464 可运行 [0x00000000] java.lang.Thread.State:可运行 锁定的可拥有同步器: - 没有 “终结器”守护进程 prio=8 tid=0x02c8e800 nid=0x900 in Object.wait() [0x02e5f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.ref.ReferenceQueue.remove(未知来源) - 锁定(java.lang.ref.ReferenceQueue$Lock) 在 java.lang.ref.ReferenceQueue.remove(未知来源) 在 java.lang.ref.Finalizer$FinalizerThread.run(未知来源) 锁定的可拥有同步器: - 没有 “引用处理程序”守护进程 prio=10 tid=0x02c8d400 nid=0x71c in Object.wait() [0x02e0f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 java.lang.Object.wait(Object.java:485) 在 java.lang.ref.Reference$ReferenceHandler.run(未知来源) - 锁定(java.lang.ref.Reference$Lock) 锁定的可拥有同步器: - 没有 “main”prio=6 tid=0x002a8000 nid=0x380 in Object.wait() [0x0090f000] java.lang.Thread.State:等待(在对象监视器上) 在 java.lang.Object.wait(本机方法) 在 sun.plugin2.message.Queue.waitForMessage(未知来源) - 锁定(sun.plugin2.message.Queue) 在 sun.plugin2.message.Pipe.receive(未知来源) 在 sun.plugin2.main.client.PluginMain.mainLoop(未知来源) 在 sun.plugin2.main.client.PluginMain.run(未知来源) 在 sun.plugin2.main.client.PluginMain.main(未知来源) 锁定的可拥有同步器: - 没有 “VM 线程”prio=10 tid=0x02c8bc00 nid=0x814 可运行 “VM 周期性任务线程”prio=10 tid=0x02ca9400 nid=0x4bc 等待条件 JNI 全局引用:2569

【问题讨论】:

如您所见,您有一个阻塞锁,其中 AWT 1 和 2 正在等待 AWT-0 中的操作以获取 AbstractDocument 上的 readLock。您是否背靠背进行了多个线程转储?间隔超过 10 秒。这 3 个线程是否会出现相同的结果?这个锁能维持多久? 嗨,肖恩,首先感谢您如此迅速地回复。关于您的问题它永远挂起,我们在客户网站上挂起大约 6 分钟后得到了第一个线程转储。我们等了更长的时间,但从未解放自己。 好的,6 分钟很长。阻塞锁并不少见,它们通常会在您注意到之前自行解决(几分之一秒)。让我再看看@罪魁祸首线程 我确实发现了这个错误bugs.sun.com/bugdatabase/view_bug.do?bug_id=6665129 检查您的 java 版本,因为在后面的 6 个版本中似乎有修复。不确定它们是否直接相关 另外,确认一下,因为我看到工作在 AWT-0 线程中完成,您使用 SwingUtils 调用 swing 组件? 【参考方案1】:

Java concurrency trail 解释说,对 Swing 组件及其模型的访问需要在 EDT 上进行。但是,它无法解决当您拥有多个 EDT 时会发生的情况。

“总是从 EDT 访问 swing 组件” 的更好表述可能是:“总是从 恰好一个 EDT 访问 swing 组件” .

applet 在其 JInternalFrame 中使用的 chrriis.dj.nativeswing.swtimpl 类正在创建另一个 EDT。

当 EDT#2(内部框架)正在更新文本字段,同时 EDT#0(小程序)试图重新绘制相同的文本字段时,就会发生死锁。

解决方案是不要在 EDT 之间传递任何 Swing 组件或其模型。而是使用带有内部框架的BlockingQueue 作为生产者,使用SwingWorker(由小程序启动)作为消费者。一旦 SwingWorker 从 BlockingQueue 读取更新,它就可以通过其done 方法将数据传回其 EDT。如果您需要发布中间结果,请使用 publishprocess 方法

【讨论】:

您好,非常感谢您的意见。我已经对这个问题做了一些进一步的调查,所以我只创建了一个简单的基本小程序并将 JVisual VM 工具附加到它上面。它像以前一样显示不是一个而是 3 个 EDT,因此在这种情况下,添加额外 EDT 的不是 chrriis.dj.nativeswing.swtimpl 类。我已经用 Sun oops Oracle 记录了这个问题,他们已经接受了这个问题作为一个错误(尽管在他们的估计中优先级很低)。再次非常感谢所有在这个问题上留下 cmets/回复的人,他们都非常感谢。

以上是关于Java Swing 1.6 更新 23 个使用 Applet 的 JVM 锁的主要内容,如果未能解决你的问题,请参考以下文章

您推荐哪种 Swing 布局? [关闭]

java版本的选择

JTextArea 中的 Java Swing 更新字符串

Java Swing JXDatePicker

使用java swing做个界面,中间的容器部分是加载一个网页,该如何解决、可以提供代码参考最好

使用java swing做个界面,中间的容器部分是加载一个网页,该如何解决、可以提供代码参考最好