SwingWorker
サブクラスを複数回使用できるようにしたい。これは可能ですか?
私はjavadocを読みました:
SwingWorker
一度だけ実行されるように設計されています。SwingWorker
複数回実行しても、doInBackground
メソッドが2回呼び出されることはありません。
SwingWorker
サブクラスを複数回使用できるようにしたい。これは可能ですか?
私はjavadocを読みました:
SwingWorker
一度だけ実行されるように設計されています。SwingWorker
複数回実行しても、doInBackground
メソッドが2回呼び出されることはありません。
SwingWorkerを実装するクラスの1つのインスタンスは、実際には1回だけ実行できます。必要な数のインスタンスをインスタンス化して実行することに制限はありません。
必要な数のインスタンスをインスタンス化して実行することはできません。SwingWorkerクラスにはjavax.swing.SwingWorkerが存在します。MAX_WORKER_THREADS =10。したがって、最大10個のインスタンスを実行できます。インスタンスが解放されるのは、アイドル時間に10分しか費やさない場合のみです。SwingWorkerインスタンスをスレッドインスタンスとして使用しないでください。スレッドではありません。
これを試してみてください:
private void startTask() {// main method that creates the background task or class that implements the SwingWorker
AppContext appContext = AppContext.getAppContext();
if(appContext!=null){
appContext.remove(SwingWorker.class);
}
MassiveMigrationTask task = new MassiveMigrationTask();// class that implements the SwingWorker
task.execute();// this process implicitly adds the SwingWorker.class to the appContext
}
説明として:「AppContextは、アプリケーションサービスインスタンスを格納するThreadGroupによって参照されるテーブルです。」
したがって、この問題は基本的にAppContextがSwingWorker ...というスレッドの名前を保存しているために発生します。したがって、スレッドの別のインスタンスを作成しようとすると、新しいスレッドを実行する前にそのスレッド名が評価されるため、おそらく成功しません。 1つ、または少なくとも新しいスレッドを実行するスレッドのヒープに配置します。ここでコードを参照してください。
http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/AppContext.java
PS:重要:「アプリケーションサービスを作成していない場合、またはアプリケーションサービスが何であるかわからない場合は、このクラスを使用しないでください」
メソッドからSwingWorkerを再度呼び出すことができdone()
ます(コードの設計方法によって異なります)
MySwingWorker worker = new MySwingWorker();
worker.setData(this.getData());
worker.execute();
よろしくsetData()
とgetData()
これは、入力データをSwing Workerに渡すために使用している単純なハッシュマップなので、再実行するために、同じ入力をSwingWorkerの新しいインスタンスに渡しました。