多次执行SwingWorker

时间:2010-10-04 11:13:24

标签: java multithreading swing swingworker

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

我已阅读过java doc:

  

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

4 个答案:

答案 0 :(得分:9)

实现SwingWorker的类的一个实例实际上只能运行一次。对您实例化所需的实例并运行它们没有任何限制。

答案 1 :(得分:1)

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

答案 2 :(得分: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:重要:"如果您不是在撰写应用程序服务,或者不知道应用程序服务是什么,请不要使用此类"

答案 3 :(得分:0)

您可以从 Task<T> 方法再次调用您的 Swing 工人(取决于您的代码如何设计)

done()

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

这只是我用来将输入数据传递给我的 Swing Worker 的简单哈希图,因此为了重新运行它,我只是将相同的输入传递给了 Swing Worker 的新实例