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ループで操作を実行するために停止した後に生き続け、彼らはまだ彼らはもはや使用されていないにもかかわらず、多くのメモリを蓄積します。私は彼らがキャンセルされた後、スレッドが生きているようにしたい、私はここで何かを逃していませんか?
は実際には、私のプログラムで(彼らは達して以来、「nullを返す;」?と私が思う何の関係もない)アイドル状態になっているスレッドは、別の今後のSwingWorkerのタスクの作業を引き継ぐません。私がSwingWorkerを取り出して、 ".execute()"メソッドを再利用しても、実際には新しいスレッドが作成されます。そして、それは私が本当に避けたいものです! 私は、ユーザーがボタンを押してからスイングワーカーが何かを連続的に計算するプログラムがあるとします。別のボタンを押した後、スウィングワーカーは計算を止めて死ぬか、少なくともアイドル状態にして、次のボタンを押したときに計算を引き継ぐ。 – freeprogramer233
私のプログラムでは、最初のボタンと2番目のボタンを押してこの手順を5回繰り返すと、スイングワーカースレッドを5回再利用するのではなく、2回目のボタンを押すたびに殺す代わりに、 (計算を開始するために)最初のボタンを押して新しいものを作成します。 – freeprogramer233
@ freeprogramer233おそらくあなたは間違った方法でSwingWorkerを使用しているかもしれませんし、以前のものが終了した後に新しいワーカーを起動していると思うかもしれませんが、それは真実ではない、または実装の裁量です! あなたはSwingWorkerのがどのように動作するか本当に不満足なら、あなたは常に厳しい、deterministictのExecutorServiceのを使用することができます - あなたは新しい 'SwingWorkers'を実行するスレッドプールのinsteedに' Runnbale'sを提出します。がんばろう! – Antoniossss