lop*_*d98 6 java swing swingworker
我有一个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 <0x22ec63d8> (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)
Run Code Online (Sandbox Code Playgroud)
我制作了一个示例程序,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<Object, String>() {
@Override
protected Object doInBackground() throws Exception {
publish("Background task.");
return null;
}
@Override
protected void process(List<String> chunks) {
for (String str : chunks) {
outputArea.append(str + "\n");
}
}
@Override
protected void done() {
outputArea.append("Background task finished.");
}
}).execute();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1533 次 |
| 最近记录: |