Потоки SwingWorker / утечка памяти при многократном создании - PullRequest
4 голосов
/ 03 февраля 2012

У меня есть 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 Ответ

4 голосов
/ 03 февраля 2012

JavaDoc говорит:

Планирует выполнение этого SwingWorker в рабочем потоке.Доступно несколько рабочих потоков.В случае, если все рабочие потоки заняты обработкой других SwingWorkers, этот SwingWorker помещается в очередь ожидания.

Вы пытались закрыть и открыть его более 6 раз, чтобы увидеть, нет ли в конечном итоге нового потокадобавлен?Я предполагаю, что вы еще не достигли лимита пула потоков.

...