gpt4 book ai didi

java - SwingWorker 卡在 Unsafe.park()

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:26 26 4
gpt4 key购买 nike

我有一个 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)

我制作了一个示例程序,它按照在应用程序中通常使用的方式使用 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();
}
}

最佳答案

这是 SwingWorker 的正常行为,如果线程处于空闲状态,它应该在 10 分钟后终止。解释了here

关于java - SwingWorker 卡在 Unsafe.park(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278791/

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