10

我希望能够SwingWorker多次使用子类。这可能吗?

我在java文档中读过:

SwingWorker仅设计为执行一次。SwingWorker多次执行 a不会导致调用该doInBackground方法两次。

4

4 回答 4

10

实现 SwingWorker 的类的一个实例实际上只能运行一次。根据需要实例化尽可能多的实例并运行它们没有任何限制。

于 2010-10-04T11:24:05.800 回答
1

您无法实例化尽可能多的实例并执行它们。在 SwingWorker 类中存在 javax.swing.SwingWorker。MAX_WORKER_THREADS = 10。因此您最多可以执行 10 个实例。只有在空闲时间花费 10 分钟的实例才会被释放。不要将 SwingWorker 实例用作 Thread 实例;它不是线程。

于 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 的线程的名称...,所以如果您尝试创建线程的另一个实例,您可能不会成功,因为它会在执行新线程之前评估该线程名称一个或至少将新的线程堆中要执行的线程,随时咨询这里的代码:

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

您可以从done()方法中再次调用您的摇摆工人(取决于您的代码设计方式)

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

尊重setData()getData()

这只是我用来将输入数据传递给我的摇摆工人的简单哈希图,所以为了重新运行它,我只是将相同的输入传递给摇摆工人的新实例

于 2021-05-12T19:13:36.193 回答