多线程阻塞问题的监控与调试

来源:互联网 发布:手机怎么登陆淘宝店铺 编辑:程序博客网 时间:2024/04/28 17:12

          最近,因为工作需要,做了个基于Applet的多文件上传的上传组件。简要介绍一下上传组件的原理:提交上传的每个文件作为一个客户端线程与服务器交互,同时每个文件上传线程对应一个读取服务端响应的服务线程,所有客户端线程都通过Applet主线程启动。由于整个组件的代码量较大这里不便于贴出来,我把问题以及解决问题的思路贴出来,这样也算是对自己前段时间的研究成果做一个总结,这样也为自己和后来人提供一个解决此类问题的思路。

上传组件外观图:

文件上传演示图:

    问题就出在这里,当文件上传到百分之九十九点几的时候,进度条就不再动了,整个过程暂停了20几秒,然后才会提示文件上传结束。通过Applet Console控制信息,可以看到进度条开始等待的时候,服务端反馈信息已经发回到组件中,而且反馈信息已经被解析结束了。

    我很纳闷,为什么前后台的交互都已经结束了,上传线程为什么还会阻塞一段时间才结束。由此我首先想到的事线程调度方面的问题。这里需要插入一个画外音,由于Applet是嵌入在浏览器上的java程序,针对Applet的线程调试并不是像普通java程序调试那么简单。

    经过一番苦苦挣扎,我意外发现了一个惊喜,就是JDK的1.6.07以上版本集成了VisualVM插件,专门用来用于Java多线程的监控分析。下面贴上几张我认为有助于解决问题的线程监控图。

1.首先第一张是上传组件中的线程运行时间线:

在文件上传线程UploadThread-0和UploadThread-1的红色指示部分正是进度条暂停等待的时间。

2.下面对涉及线程阻塞的UploadThread-1、ReadLine-1两个具有代表性的线程进行线程转储,查看其具体栈信息:

UploadThread-1线程转储信息:

2012-03-20 11:43:30Full thread dump Java HotSpot(TM) Client VM (20.5-b03 mixed mode, sharing):"RMI TCP Connection(4)-192.168.100.155" daemon prio=6 tid=0x03512400 nid=0xe9c runnable [0x0518f000]   java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(Unknown Source)at java.io.BufferedInputStream.fill(Unknown Source)at java.io.BufferedInputStream.read(Unknown Source)- locked <0x289ebfb0> (a java.io.BufferedInputStream)at java.io.FilterInputStream.read(Unknown Source)at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- <0x289f1478> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"UploadThread-1" prio=4 tid=0x0346e800 nid=0xfac in Object.wait() [0x0527f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x288fcab0> (a sun.plugin2.message.Queue)at sun.plugin2.message.Queue.waitForMessage(Unknown Source)- locked <0x288fcab0> (a sun.plugin2.message.Queue)at sun.plugin2.message.Pipe.receive(Unknown Source)at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source)at sun.plugin2.main.client.MessagePassingJSObject.eval(Unknown Source)at pudn.postlet.src.Main.setProgress(Main.java:994)- locked <0x2855e0c8> (a pudn.postlet.src.Main)at pudn.postlet.src.UploadThread.upload(UploadThread.java:175)at pudn.postlet.src.UploadThread.run(UploadThread.java:116)   Locked ownable synchronizers:- None"JMX server connection timeout 57" daemon prio=6 tid=0x03518800 nid=0xb98 in Object.wait() [0x050ef000]   java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x286a4f60> (a [I)at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(Unknown Source)- locked <0x286a4f60> (a [I)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"RMI Scheduler(0)" daemon prio=6 tid=0x034fd400 nid=0x5b8 waiting on condition [0x0509f000]   java.lang.Thread.State: TIMED_WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x286a4ff0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)at java.util.concurrent.DelayQueue.take(Unknown Source)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"RMI TCP Accept-0" daemon prio=6 tid=0x034d5400 nid=0xd5c runnable [0x03f9f000]   java.lang.Thread.State: RUNNABLEat java.net.PlainSocketImpl.socketAccept(Native Method)at java.net.PlainSocketImpl.accept(Unknown Source)- locked <0x286a5530> (a java.net.SocksSocketImpl)at java.net.ServerSocket.implAccept(Unknown Source)at java.net.ServerSocket.accept(Unknown Source)at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Swing-Shell" daemon prio=4 tid=0x03538800 nid=0x62c waiting on condition [0x04a0f000]   java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x2863b078> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Thread-11" prio=4 tid=0x03472400 nid=0xaa0 waiting on condition [0x0447f000]   java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at pudn.postlet.src.JavascriptListener.run(JavascriptListener.java:43)   Locked ownable synchronizers:- None"TimerQueue" daemon prio=4 tid=0x03454c00 nid=0xeb0 in Object.wait() [0x0442f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x2855e3e8> (a javax.swing.TimerQueue)at javax.swing.TimerQueue.run(Unknown Source)- locked <0x2855e3e8> (a javax.swing.TimerQueue)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"ConsoleWriterThread" daemon prio=6 tid=0x0341b000 nid=0x8b0 in Object.wait() [0x0435f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f5e2d0> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at com.sun.deploy.util.ConsoleTraceListener$ConsoleWriterThread.run(Unknown Source)- locked <0x27f5e2d0> (a java.lang.Object)   Locked ownable synchronizers:- None"TimerQueue" daemon prio=6 tid=0x0349c800 nid=0xf20 in Object.wait() [0x0423f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x28068de0> (a javax.swing.TimerQueue)at javax.swing.TimerQueue.run(Unknown Source)- locked <0x28068de0> (a javax.swing.TimerQueue)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Windows Tray Icon Thread" prio=6 tid=0x03439400 nid=0x8d0 runnable [0x041ef000]   java.lang.Thread.State: RUNNABLEat com.sun.deploy.ui.WindowsJavaTrayIcon.mainLoop(Native Method)at com.sun.deploy.ui.WindowsJavaTrayIcon.access$700(Unknown Source)at com.sun.deploy.ui.WindowsJavaTrayIcon$2.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"thread applet-pudn.postlet.src.Main.class-1" prio=4 tid=0x033c1800 nid=0x68c in Object.wait() [0x03e1f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f4abb0> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)- locked <0x27f4abb0> (a java.lang.Object)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-EventQueue-2" prio=4 tid=0x033a7800 nid=0xb8c in Object.wait() [0x0129f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2ded8> (a java.awt.EventQueue)at java.lang.Object.wait(Object.java:485)at java.awt.EventQueue.getNextEvent(Unknown Source)- locked <0x27f2ded8> (a java.awt.EventQueue)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(Unknown Source)   Locked ownable synchronizers:- None"JVM[id=0]-Heartbeat" daemon prio=6 tid=0x033aa000 nid=0xc0c in Object.wait() [0x03a6f000]   java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2df38> (a sun.plugin2.main.client.PluginMain$Heartbeat)at sun.plugin2.main.server.HeartbeatThread.run(Unknown Source)- locked <0x27f2df38> (a sun.plugin2.main.client.PluginMain$Heartbeat)   Locked ownable synchronizers:- None"Applet 1 LiveConnect Worker Thread" prio=4 tid=0x033aa800 nid=0x64c in Object.wait() [0x039cf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e070> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)- locked <0x27f2e070> (a java.lang.Object)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Browser Side Object Cleanup Thread" prio=6 tid=0x033d3400 nid=0xe6c in Object.wait() [0x0397f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e100> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2e100> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at sun.plugin2.main.client.LiveConnectSupport$BrowserSideObjectCleanupThread.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-EventQueue-1" prio=6 tid=0x0338d400 nid=0x6ec in Object.wait() [0x037bf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e418> (a java.awt.EventQueue)at java.lang.Object.wait(Object.java:485)at java.awt.EventQueue.getNextEvent(Unknown Source)- locked <0x27f2e418> (a java.awt.EventQueue)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(Unknown Source)   Locked ownable synchronizers:- None"CacheCleanUpThread" daemon prio=6 tid=0x03389400 nid=0xe0c in Object.wait() [0x0376f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e4b0> (a com.sun.deploy.cache.CleanupThread)at java.lang.Object.wait(Object.java:485)at com.sun.deploy.cache.CleanupThread.run(Unknown Source)- locked <0x27f2e4b0> (a com.sun.deploy.cache.CleanupThread)   Locked ownable synchronizers:- None"CacheMemoryCleanUpThread" daemon prio=6 tid=0x0337ac00 nid=0xf4c in Object.wait() [0x0371f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e5f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2e5f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at com.sun.deploy.cache.MemoryCache$LoadedResourceCleanupThread.run(Unknown Source)   Locked ownable synchronizers:- None"SysExecutionTheadCreator" daemon prio=6 tid=0x03373800 nid=0xe48 in Object.wait() [0x0367f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e6c0> (a sun.plugin.util.PluginSysUtil$SysExecutionThreadCreator)at java.lang.Object.wait(Object.java:485)at sun.plugin.util.PluginSysUtil$SysExecutionThreadCreator.run(Unknown Source)- locked <0x27f2e6c0> (a sun.plugin.util.PluginSysUtil$SysExecutionThreadCreator)   Locked ownable synchronizers:- None"AWT-EventQueue-0" prio=6 tid=0x03370000 nid=0xec4 in Object.wait() [0x0362f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e7b8> (a java.awt.EventQueue)at java.lang.Object.wait(Object.java:485)at java.awt.EventQueue.getNextEvent(Unknown Source)- locked <0x27f2e7b8> (a java.awt.EventQueue)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-Windows" daemon prio=6 tid=0x0336e800 nid=0xa98 runnable [0x00acf000]   java.lang.Thread.State: RUNNABLEat sun.awt.windows.WToolkit.eventLoop(Native Method)at sun.awt.windows.WToolkit.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-Shutdown" prio=6 tid=0x0336a400 nid=0x840 in Object.wait() [0x035df000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e8f8> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at sun.awt.AWTAutoShutdown.run(Unknown Source)- locked <0x27f2e8f8> (a java.lang.Object)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Java2D Disposer" daemon prio=10 tid=0x0334a800 nid=0xff0 in Object.wait() [0x0358f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e990> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2e990> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at sun.java2d.Disposer.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Java Plug-In Pipe Worker Thread (Client-Side)" daemon prio=6 tid=0x00e64400 nid=0xe00 runnable [0x012ef000]   java.lang.Thread.State: RUNNABLEat sun.plugin2.os.windows.Windows.ReadFile0(Native Method)at sun.plugin2.os.windows.Windows.ReadFile(Unknown Source)at sun.plugin2.ipc.windows.WindowsNamedPipe.read(Unknown Source)at sun.plugin2.message.transport.NamedPipeTransport$SerializerImpl.read(Unknown Source)at sun.plugin2.message.transport.NamedPipeTransport$SerializerImpl.readByte(Unknown Source)at sun.plugin2.message.AbstractSerializer.readInt(Unknown Source)at sun.plugin2.message.transport.SerializingTransport.read(Unknown Source)at sun.plugin2.message.Pipe$WorkerThread.run(Unknown Source)   Locked ownable synchronizers:- None"Timer-0" prio=6 tid=0x00e5f000 nid=0xa3c in Object.wait() [0x0124f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2eb80> (a java.util.TaskQueue)at java.lang.Object.wait(Object.java:485)at java.util.TimerThread.mainLoop(Unknown Source)- locked <0x27f2eb80> (a java.util.TaskQueue)at java.util.TimerThread.run(Unknown Source)   Locked ownable synchronizers:- None"traceMsgQueueThread" daemon prio=6 tid=0x00e5d800 nid=0xd04 in Object.wait() [0x011cf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f37610> (a java.util.ArrayList)at java.lang.Object.wait(Object.java:485)at com.sun.deploy.util.Trace$TraceMsgQueueChecker.run(Unknown Source)- locked <0x27f37610> (a java.util.ArrayList)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Low Memory Detector" daemon prio=6 tid=0x00e3c400 nid=0x304 runnable [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"C1 CompilerThread0" daemon prio=10 tid=0x00e35c00 nid=0x664 waiting on condition [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"Attach Listener" daemon prio=10 tid=0x00e34400 nid=0x818 waiting on condition [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"Signal Dispatcher" daemon prio=10 tid=0x00e42800 nid=0xdc runnable [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"Finalizer" daemon prio=8 tid=0x00e2a000 nid=0xbc0 in Object.wait() [0x00fbf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2ee38> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2ee38> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)   Locked ownable synchronizers:- None"Reference Handler" daemon prio=10 tid=0x00e28800 nid=0xd78 in Object.wait() [0x00f6f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2d778> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:485)at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)- locked <0x27f2d778> (a java.lang.ref.Reference$Lock)   Locked ownable synchronizers:- None"main" prio=6 tid=0x002f8000 nid=0x410 in Object.wait() [0x0089f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2eec8> (a sun.plugin2.message.Queue)at sun.plugin2.message.Queue.waitForMessage(Unknown Source)- locked <0x27f2eec8> (a sun.plugin2.message.Queue)at sun.plugin2.message.Pipe.receive(Unknown Source)at sun.plugin2.main.client.PluginMain.mainLoop(Unknown Source)at sun.plugin2.main.client.PluginMain.run(Unknown Source)at sun.plugin2.main.client.PluginMain.main(Unknown Source)   Locked ownable synchronizers:- None"VM Thread" prio=10 tid=0x00debc00 nid=0xd2c runnable "VM Periodic Task Thread" prio=10 tid=0x00e4b400 nid=0xa9c waiting on condition JNI global references: 1838
ReadLine-1线程转储信息:
2012-03-20 11:40:45Full thread dump Java HotSpot(TM) Client VM (20.5-b03 mixed mode, sharing):"UploadThread-1" prio=4 tid=0x0346e800 nid=0xfac in Object.wait() [0x0527f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x288fcab0> (a sun.plugin2.message.Queue)at sun.plugin2.message.Queue.waitForMessage(Unknown Source)- locked <0x288fcab0> (a sun.plugin2.message.Queue)at sun.plugin2.message.Pipe.receive(Unknown Source)at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source)at sun.plugin2.main.client.MessagePassingJSObject.eval(Unknown Source)at pudn.postlet.src.Main.setProgress(Main.java:994)- locked <0x2855e0c8> (a pudn.postlet.src.Main)at pudn.postlet.src.UploadThread.upload(UploadThread.java:175)at pudn.postlet.src.UploadThread.run(UploadThread.java:116)   Locked ownable synchronizers:- None"RMI TCP Connection(3)-192.168.100.155" daemon prio=6 tid=0x04612400 nid=0xb48 runnable [0x0428f000]   java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(Unknown Source)at java.io.BufferedInputStream.fill(Unknown Source)at java.io.BufferedInputStream.read(Unknown Source)- locked <0x287e0e90> (a java.io.BufferedInputStream)at java.io.FilterInputStream.read(Unknown Source)at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- <0x287e57d8> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)"JMX server connection timeout 57" daemon prio=6 tid=0x03518800 nid=0xb98 in Object.wait() [0x050ef000]   java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x286a4f60> (a [I)at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(Unknown Source)- locked <0x286a4f60> (a [I)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"RMI Scheduler(0)" daemon prio=6 tid=0x034fd400 nid=0x5b8 waiting on condition [0x0509f000]   java.lang.Thread.State: TIMED_WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x286a4ff0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.parkNanos(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(Unknown Source)at java.util.concurrent.DelayQueue.take(Unknown Source)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"RMI TCP Accept-0" daemon prio=6 tid=0x034d5400 nid=0xd5c runnable [0x03f9f000]   java.lang.Thread.State: RUNNABLEat java.net.PlainSocketImpl.socketAccept(Native Method)at java.net.PlainSocketImpl.accept(Unknown Source)- locked <0x286a5530> (a java.net.SocksSocketImpl)at java.net.ServerSocket.implAccept(Unknown Source)at java.net.ServerSocket.accept(Unknown Source)at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Swing-Shell" daemon prio=4 tid=0x03538800 nid=0x62c waiting on condition [0x04a0f000]   java.lang.Thread.State: WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for  <0x2863b078> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)at java.util.concurrent.locks.LockSupport.park(Unknown Source)at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)at java.util.concurrent.LinkedBlockingQueue.take(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at sun.awt.shell.Win32ShellFolderManager2$ComInvoker$3.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Thread-11" prio=4 tid=0x03472400 nid=0xaa0 waiting on condition [0x0447f000]   java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at pudn.postlet.src.JavascriptListener.run(JavascriptListener.java:43)   Locked ownable synchronizers:- None"TimerQueue" daemon prio=4 tid=0x03454c00 nid=0xeb0 in Object.wait() [0x0442f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x2855e3e8> (a javax.swing.TimerQueue)at javax.swing.TimerQueue.run(Unknown Source)- locked <0x2855e3e8> (a javax.swing.TimerQueue)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"ConsoleWriterThread" daemon prio=6 tid=0x0341b000 nid=0x8b0 in Object.wait() [0x0435f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f5e2d0> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at com.sun.deploy.util.ConsoleTraceListener$ConsoleWriterThread.run(Unknown Source)- locked <0x27f5e2d0> (a java.lang.Object)   Locked ownable synchronizers:- None"TimerQueue" daemon prio=6 tid=0x0349c800 nid=0xf20 in Object.wait() [0x0423f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x28068de0> (a javax.swing.TimerQueue)at javax.swing.TimerQueue.run(Unknown Source)- locked <0x28068de0> (a javax.swing.TimerQueue)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Windows Tray Icon Thread" prio=6 tid=0x03439400 nid=0x8d0 runnable [0x041ef000]   java.lang.Thread.State: RUNNABLEat com.sun.deploy.ui.WindowsJavaTrayIcon.mainLoop(Native Method)at com.sun.deploy.ui.WindowsJavaTrayIcon.access$700(Unknown Source)at com.sun.deploy.ui.WindowsJavaTrayIcon$2.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"thread applet-pudn.postlet.src.Main.class-1" prio=4 tid=0x033c1800 nid=0x68c in Object.wait() [0x03e1f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f4abb0> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)- locked <0x27f4abb0> (a java.lang.Object)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-EventQueue-2" prio=4 tid=0x033a7800 nid=0xb8c in Object.wait() [0x0129f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2ded8> (a java.awt.EventQueue)at java.lang.Object.wait(Object.java:485)at java.awt.EventQueue.getNextEvent(Unknown Source)- locked <0x27f2ded8> (a java.awt.EventQueue)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(Unknown Source)   Locked ownable synchronizers:- None"JVM[id=0]-Heartbeat" daemon prio=6 tid=0x033aa000 nid=0xc0c in Object.wait() [0x03a6f000]   java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2dfc0> (a sun.plugin2.message.Queue)at sun.plugin2.message.Queue.waitForMessage(Unknown Source)- locked <0x27f2dfc0> (a sun.plugin2.message.Queue)at sun.plugin2.message.Pipe.receive(Unknown Source)at sun.plugin2.main.server.HeartbeatThread.run(Unknown Source)   Locked ownable synchronizers:- None"Applet 1 LiveConnect Worker Thread" prio=4 tid=0x033aa800 nid=0x64c in Object.wait() [0x039cf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e070> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$LiveConnectWorker.run(Unknown Source)- locked <0x27f2e070> (a java.lang.Object)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Browser Side Object Cleanup Thread" prio=6 tid=0x033d3400 nid=0xe6c in Object.wait() [0x0397f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e100> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2e100> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at sun.plugin2.main.client.LiveConnectSupport$BrowserSideObjectCleanupThread.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-EventQueue-1" prio=6 tid=0x0338d400 nid=0x6ec in Object.wait() [0x037bf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e418> (a java.awt.EventQueue)at java.lang.Object.wait(Object.java:485)at java.awt.EventQueue.getNextEvent(Unknown Source)- locked <0x27f2e418> (a java.awt.EventQueue)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(Unknown Source)   Locked ownable synchronizers:- None"CacheCleanUpThread" daemon prio=6 tid=0x03389400 nid=0xe0c in Object.wait() [0x0376f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e4b0> (a com.sun.deploy.cache.CleanupThread)at java.lang.Object.wait(Object.java:485)at com.sun.deploy.cache.CleanupThread.run(Unknown Source)- locked <0x27f2e4b0> (a com.sun.deploy.cache.CleanupThread)   Locked ownable synchronizers:- None"CacheMemoryCleanUpThread" daemon prio=6 tid=0x0337ac00 nid=0xf4c in Object.wait() [0x0371f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e5f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2e5f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at com.sun.deploy.cache.MemoryCache$LoadedResourceCleanupThread.run(Unknown Source)   Locked ownable synchronizers:- None"SysExecutionTheadCreator" daemon prio=6 tid=0x03373800 nid=0xe48 in Object.wait() [0x0367f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e6c0> (a sun.plugin.util.PluginSysUtil$SysExecutionThreadCreator)at java.lang.Object.wait(Object.java:485)at sun.plugin.util.PluginSysUtil$SysExecutionThreadCreator.run(Unknown Source)- locked <0x27f2e6c0> (a sun.plugin.util.PluginSysUtil$SysExecutionThreadCreator)   Locked ownable synchronizers:- None"AWT-EventQueue-0" prio=6 tid=0x03370000 nid=0xec4 in Object.wait() [0x0362f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e7b8> (a java.awt.EventQueue)at java.lang.Object.wait(Object.java:485)at java.awt.EventQueue.getNextEvent(Unknown Source)- locked <0x27f2e7b8> (a java.awt.EventQueue)at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.pumpEvents(Unknown Source)at java.awt.EventDispatchThread.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-Windows" daemon prio=6 tid=0x0336e800 nid=0xa98 runnable [0x00acf000]   java.lang.Thread.State: RUNNABLEat sun.awt.windows.WToolkit.eventLoop(Native Method)at sun.awt.windows.WToolkit.run(Unknown Source)   Locked ownable synchronizers:- None"AWT-Shutdown" prio=6 tid=0x0336a400 nid=0x840 in Object.wait() [0x035df000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e8f8> (a java.lang.Object)at java.lang.Object.wait(Object.java:485)at sun.awt.AWTAutoShutdown.run(Unknown Source)- locked <0x27f2e8f8> (a java.lang.Object)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Java2D Disposer" daemon prio=10 tid=0x0334a800 nid=0xff0 in Object.wait() [0x0358f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2e990> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2e990> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at sun.java2d.Disposer.run(Unknown Source)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Java Plug-In Pipe Worker Thread (Client-Side)" daemon prio=6 tid=0x00e64400 nid=0xe00 runnable [0x012ef000]   java.lang.Thread.State: RUNNABLEat sun.plugin2.os.windows.Windows.ReadFile0(Native Method)at sun.plugin2.os.windows.Windows.ReadFile(Unknown Source)at sun.plugin2.ipc.windows.WindowsNamedPipe.read(Unknown Source)at sun.plugin2.message.transport.NamedPipeTransport$SerializerImpl.read(Unknown Source)at sun.plugin2.message.transport.NamedPipeTransport$SerializerImpl.readByte(Unknown Source)at sun.plugin2.message.AbstractSerializer.readInt(Unknown Source)at sun.plugin2.message.transport.SerializingTransport.read(Unknown Source)at sun.plugin2.message.Pipe$WorkerThread.run(Unknown Source)   Locked ownable synchronizers:- None"Timer-0" prio=6 tid=0x00e5f000 nid=0xa3c in Object.wait() [0x0124f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2eb80> (a java.util.TaskQueue)at java.lang.Object.wait(Object.java:485)at java.util.TimerThread.mainLoop(Unknown Source)- locked <0x27f2eb80> (a java.util.TaskQueue)at java.util.TimerThread.run(Unknown Source)   Locked ownable synchronizers:- None"traceMsgQueueThread" daemon prio=6 tid=0x00e5d800 nid=0xd04 in Object.wait() [0x011cf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f37610> (a java.util.ArrayList)at java.lang.Object.wait(Object.java:485)at com.sun.deploy.util.Trace$TraceMsgQueueChecker.run(Unknown Source)- locked <0x27f37610> (a java.util.ArrayList)at java.lang.Thread.run(Unknown Source)   Locked ownable synchronizers:- None"Low Memory Detector" daemon prio=6 tid=0x00e3c400 nid=0x304 runnable [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"C1 CompilerThread0" daemon prio=10 tid=0x00e35c00 nid=0x664 waiting on condition [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"Attach Listener" daemon prio=10 tid=0x00e34400 nid=0x818 waiting on condition [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"Signal Dispatcher" daemon prio=10 tid=0x00e42800 nid=0xdc runnable [0x00000000]   java.lang.Thread.State: RUNNABLE   Locked ownable synchronizers:- None"Finalizer" daemon prio=8 tid=0x00e2a000 nid=0xbc0 in Object.wait() [0x00fbf000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2ee38> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)- locked <0x27f2ee38> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(Unknown Source)at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)   Locked ownable synchronizers:- None"Reference Handler" daemon prio=10 tid=0x00e28800 nid=0xd78 in Object.wait() [0x00f6f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2d778> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:485)at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)- locked <0x27f2d778> (a java.lang.ref.Reference$Lock)   Locked ownable synchronizers:- None"main" prio=6 tid=0x002f8000 nid=0x410 in Object.wait() [0x0089f000]   java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x27f2eec8> (a sun.plugin2.message.Queue)at sun.plugin2.message.Queue.waitForMessage(Unknown Source)- locked <0x27f2eec8> (a sun.plugin2.message.Queue)at sun.plugin2.message.Pipe.receive(Unknown Source)at sun.plugin2.main.client.PluginMain.mainLoop(Unknown Source)at sun.plugin2.main.client.PluginMain.run(Unknown Source)at sun.plugin2.main.client.PluginMain.main(Unknown Source)   Locked ownable synchronizers:- None"VM Thread" prio=10 tid=0x00debc00 nid=0xd2c runnable "VM Periodic Task Thread" prio=10 tid=0x00e4b400 nid=0xa9c waiting on condition JNI global references: 1838

    大篇幅的线程转储信息看得人眼花缭乱,浏览前几遍的时候,我都快吐了,并且还不知道该从哪下手。后来我硬是忍住内心波涛汹涌的反胃,认真检查了线程转储信息有什么异常和规律。难怪有人说技术达人们都是一遍遍地恶心出来的,当然我只是一个小喽啰,在这里不敢自吹自擂,只是弱弱地体验了一下恶心的经历。

    在UploadThread-1线程转储信息中我看到了点蜘丝马迹:

第一个就是上传线程UploadThread-1阻塞位置:

 第二个就是导致线程阻塞的源头:

从截图中大概可以看出,线程阻塞是由于读取服务端反馈信息ReadLine-1线程还在运行。

    然后回过头,认真检查这部分代码,Applet中用于前后台交互的工具socket,使用了下面的构造模式:

try{    ...    in = socket.getInputStream(); //当然这里为了简化程序,没有贴出I/O的封装流    out = socket.getOutputStream();    ...} catch( e ) {    ...} finally {    in.close();    out.close();}

    这里,意外的发现代码finally块中的小Bug:输入流和输出流的关闭次序有问题。然后,我就对程序做了修改,调换了一下输入流和输出流的关闭次序,再进行组件上传调试。奇迹出现了,线程阻塞问题让我误打误撞地给解决了,终于没有枉费我这段时间苦苦挣扎的心血。

    历经这个让我寻寻觅觅、跌跌撞撞的问题,我才发现作为一个程序员,细节问题是多么的至关重要。值得庆幸的是,仅仅因为这个细节问题,让我猛补了自己多线程知识方面的缺陷。

    谨以此文纪念我这段时间研究Applet多线程的心得体会。


 

 

	
				
		
原创粉丝点击