多次实例化时SwingWorker线程/内存泄漏

时间:2012-02-03 09:01:17

标签: java multithreading swing swingworker

我有一个显示预览内容的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()方法被调用并且它正常工作,唯一的问题是每次我关闭并重新打开预览帧时,会创建一个守护程序线程并保持运行:

Threads Leak

正如您所见,很多线程仍处于运行状态,导致泄漏。 我该如何解决这个问题?

如果我使用标准线程,我没有这个问题...

1 个答案:

答案 0 :(得分:4)

JavaDoc说:

  

安排此SwingWorker在工作线程上执行。有   有许多工作线程可用。在所有工作线程中   正在忙于处理其他SwingWorkers这个SwingWorker放在一个   等待队列。

您是否尝试关闭并重新打开它超过6次,看看最终是否没有添加新线程?我的猜测是你还没有达到线程池限制。