10

SwingWorkerサブクラスを複数回使用できるようにしたい。これは可能ですか?

私はjavadocを読みました:

SwingWorker一度だけ実行されるように設計されています。SwingWorker複数回実行しても、doInBackgroundメソッドが2回呼び出されることはありません。

4

4 に答える 4

10

SwingWorkerを実装するクラスの1つのインスタンスは、実際には1回だけ実行できます。必要な数のインスタンスをインスタンス化して実行することに制限はありません。

于 2010-10-04T11:24:05.800 に答える
1

必要な数のインスタンスをインスタンス化して実行することはできません。SwingWorkerクラスにはjavax.swing.SwingWorkerが存在します。MAX_WORKER_THREADS =10。したがって、最大10個のインスタンスを実行できます。インスタンスが解放されるのは、アイドル時間に10分しか費やさない場合のみです。SwingWorkerインスタンスをスレッドインスタンスとして使用しないでください。スレッドではありません。

于 2013-09-12T10:05:52.297 に答える
0

これを試してみてください:

  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:重要:「アプリケーションサービスを作成していない場合、またはアプリケーションサービスが何であるかわからない場合は、このクラスを使用しないでください」

于 2014-11-10T16:30:51.557 に答える
0

メソッドからSwingWorkerを再度呼び出すことができdone()ます(コードの設計方法によって異なります)

MySwingWorker worker = new MySwingWorker();
worker.setData(this.getData());
worker.execute();

よろしくsetData()getData()

これは、入力データをSwing Workerに渡すために使用している単純なハッシュマップなので、再実行するために、同じ入力をSwingWorkerの新しいインスタンスに渡しました。

于 2021-05-12T19:13:36.193 に答える