2012-02-03 10 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

あなたの問題とは関係がありません:あなたは、(EDTから実行される)doInBackgroundのビューコンポーネントにアクセスする必要はありません。代わりに、ワーカーの実行を呼び出す直前に、またはワーカーのコンストラクタでビューのconfigを実行してください。 – kleopatra

答えて

4

javadocは言う:

スケジュールワーカースレッド上で実行するため、このSwingWorkerのを。利用可能なワーカースレッドの数は です。すべてのワーカースレッド が他のSwingWorkerを処理している場合、このSwingWorkerは待機キュー に配置されます。

最終的に新しいスレッドが追加されないかどうかを6回以上確認してからもう一度試しましたか?私の推測では、まだスレッドプール制限に達していないということです。

+1

あなたは正しいです、10以上のスレッドが割り当てられていません、私は10が限界であると仮定します。しかし、なぜ彼らの仕事が終了しても、このスレッドは実行状態のままですか?それは正常な行動ですか? – aleroot

+1

はい、JVisualVMを使用して、おそらく待ち状態になっているスレッドの実際の状態を調べる場合、基本的に新しいSwingWorkersを待つように動作しています。 – stryba

+0

あなたは正しいです!私はそれに気付かなかった...ありがとう。 – aleroot

関連する問題