SwingWorker挂在Unsafe.park()

我有一个SwingWorker ,它在后台与服务器通信,然后更新JFrame 。 我正在调试我的应用程序并注意到即使在SwingWorker完成其工作之后,它的线程仍然存在。 它挂在Unsafe.park(java.lang.Object) ,这是一个本机方法。 我进一步研究了这一点,发现我的应用程序中的所有其他SwingWorker在完成后都做了同样的事情。 我可以提供源代码,如果有人想要它,但我不认为这是必要的,因为问题似乎很一般。

更新

我在没有调试器的情况下运行应用程序,问题仍在发生。 这是SwingWorker线程的转储:

 "SwingWorker-pool-2-thread-1" daemon prio=6 tid=0x03219800 nid=0xd74 waiting on condition [0x04b7f000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for  (a java.util.concurrent.locks.Abstra ctQueuedSynchronizer$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.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 

我制作了一个使用SwingWorker的示例程序,它与应用程序中通常使用的方式相同。 这个程序有同样的问题。 这是代码:

 package swingworkerlocktest; import java.util.List; import javax.swing.JFrame; import javax.swing.JTextArea; import javax.swing.SwingWorker; public class SwingWorkerLockTest { public static void main(String[] args) { final JFrame frame = new JFrame("Frame"); final JTextArea outputArea = new JTextArea(4, 20); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(outputArea); frame.pack(); frame.setVisible(true); (new SwingWorker() { @Override protected Object doInBackground() throws Exception { publish("Background task."); return null; } @Override protected void process(List chunks) { for (String str : chunks) { outputArea.append(str + "\n"); } } @Override protected void done() { outputArea.append("Background task finished."); } }).execute(); } } 

这是SwingWorker的正常行为,如果空闲,则Thread应在10分钟后终止。 它在这里解释