【问题标题】:SwingWorker threads/memory leak when instantiated multiple times多次实例化时 SwingWorker 线程/内存泄漏
【发布时间】: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


【解决方案1】:

JavaDoc 说:

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

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

【讨论】:

  • 你说得对,分配的线程不超过 10 个,我假设 10 个是限制。但是为什么这些线程即使完成了工作也仍然处于运行状态?这是正常行为吗?
  • 是的,它们基本上是在运行以等待新传入的 SwingWorker,例如,如果您使用 JVisualVM 查看线程的实际状态,您可能会看到它们处于 WAITING 状态。跨度>
  • @aleroot 还有更多信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2014-10-29
  • 2013-12-18
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多