2012-02-03 40 views
4

我有一個JFrame,顯示預覽內容,因爲預覽數據的加載可能需要幾分鐘的時間,我決定把裝載操作成的SwingWorker,這裏是一個代碼示例:的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

正如你可以很快看到線程數量龐大保持運行狀態,導致泄漏。 我該如何解決問題?

如果我使用一個標準螺紋我沒有這個問題...

+2

與您的問題無關:您必須在doInBackground(不在EDT中運行)訪問視圖組件。相反,在調用worker執行前或在worker的構造函數中執行任何視圖配置。 – kleopatra 2012-02-03 11:08:33

回答

4

的JavaDoc的說:

調度此SwingWorker的上一個工作線程執行。有 可用的工作線程數量。如果所有工作線程 正在忙於處理其他SwingWorkers,則此SwingWorker將被放置在 等待隊列中。

您是否嘗試關閉並重新打開它6次以上,以查看是否最終沒有添加新線程?我的猜測是你還沒有達到線程池限制。

+1

你是對的,不超過10個線程分配,我假設10是限制。但是爲什麼即使他們完成工作,這些線程仍然處於運行狀態?這是正常的行爲嗎? – aleroot 2012-02-03 09:27:53

+1

是的,如果你使用JVisualVM來查看你可能在WAITING狀態下看到的線程的實際狀態,它們基本上正在等待新進來的SwingWorkers。 – stryba 2012-02-03 09:32:23

+0

你是對的!我沒有注意到......謝謝。 – aleroot 2012-02-03 09:46:37