【发布时间】:2012-02-03 09:01:16
【问题描述】:
我有一个显示预览内容的 JFrame,由于预览数据的加载可能需要多次,我决定将加载操作放入 SwingWorker,这是一个代码示例:
public void setPreviewContent(final String content) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
frame.setCursor(java.awt.Cursor.getPredefinedCursor(
java.awt.Cursor.WAIT_CURSOR));
//DO My Work
return null;
}
@Override
protected void done() {
frame.setCursor(java.awt.Cursor.getPredefinedCursor(
java.awt.Cursor.DEFAULT_CURSOR));
}
};
worker.execute();
}
我的框架每次显示时都会被初始化,每次关闭时都会被处理:
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
在初始化之后,即显示setPreviewContent() 方法被调用并且它正常工作,唯一的问题是每次我关闭并重新打开预览框架时都会创建一个守护线程并保持运行:
您很快就会看到大量线程仍处于运行状态,从而导致泄漏。 我该如何解决这个问题?
如果我使用标准线程,我就没有这个问题...
【问题讨论】:
-
与您的问题无关:您不得访问 doInBackground 中的视图组件(从 EDT 运行)。相反,在调用 worker execute 之前或在 worker 的构造函数中立即执行任何视图配置。
标签: java multithreading swing swingworker