2016-05-31 4 views
1

whileループでいくつかの操作を実行するSwingWorkerを実装しました。SwingWorker(Thread)は死ぬことはありません( "return null;"に達してもまだ生きています)?

worker = new SwingWorker<Void, String>() 
    { 
     public Void doInBackground() 
     { 
      while(!this.isCancelled()) 
      { 
       //perform operations 
      } 
      return null; 
     } 


    }; 
    worker.execute(); 

私はSwingWorkerをキャンセルして、 "worker"への参照を保持し、キャンセルメソッドを使用したいと思います。

キャンセルは基本的にはうまく動作しますが、対応するスレッドはキャンセルした後も(eclipseのデバッグウィンドウに表示されているように)まだ生きているように見えますが、リソースも消費されます。

だから、いくつかのワーカースレッドを起動し、それらをキャンセル彼らは、whileループで操作を実行するために停止した後に生き続け、彼らはまだ彼らはもはや使用されていないにもかかわらず、多くのメモリを蓄積します。

私は彼らがキャンセルされた後、スレッドが生きているようにしたい、私はここで何かを逃していませんか?

答えて

2

これは、動作するようになっている方法です。 SwingWorkerはフードの下でスレッドプールを使用します。つまり、SwingWorkerを作成して直接スレッドを作成しているわけではありません。要点は、スレッドの作成にはコストがかかるため、これらのスレッドを「再利用可能」にすることです。したがって、あなたにはいくつかのタスクを実行する "ワーカースレッド"がたくさんあります。

SwingWorkerが最初に実行され、ワー​​カースレッド(デバッガに表示されているもの)がアイドル状態になってから別のスレッドを実行すると、タスクは新しいスレッドを作成するそのスレッドのinsteedによって実行されます。

リソースについて心配しないでください。ワーカースレッドプールは、しばらく使用されない場合、ワーカースレッドをシャットダウンします。

+0

は実際には、私のプログラムで(彼らは達して以来、「nullを返す;」?と私が思う何の関係もない)アイドル状態になっているスレッドは、別の今後のSwingWorkerのタスクの作業を引き継ぐません。私がSwingWorkerを取り出して、 ".execute()"メソッドを再利用しても、実際には新しいスレッドが作成されます。そして、それは私が本当に避けたいものです! 私は、ユーザーがボタンを押してからスイングワーカーが何かを連続的に計算するプログラムがあるとします。別のボタンを押した後、スウィングワーカーは計算を止めて死ぬか、少なくともアイドル状態にして、次のボタンを押したときに計算を引き継ぐ。 – freeprogramer233

+0

私のプログラムでは、最初のボタンと2番目のボタンを押してこの手順を5回繰り返すと、スイングワーカースレッドを5回再利用するのではなく、2回目のボタンを押すたびに殺す代わりに、 (計算を開始するために)最初のボタンを押して新しいものを作成します。 – freeprogramer233

+0

@ freeprogramer233おそらくあなたは間違った方法でSwingWorkerを使用しているかもしれませんし、以前のものが終了した後に新しいワーカーを起動していると思うかもしれませんが、それは真実ではない、または実装の裁量です! あなたはSwingWorkerのがどのように動作するか本当に不満足なら、あなたは常に厳しい、deterministictのExecutorServiceのを使用することができます - あなたは新しい 'SwingWorkers'を実行するスレッドプールのinsteedに' Runnbale'sを提出します。がんばろう! – Antoniossss

関連する問題