2013-04-18 64 views
0

我正在使用swing,我遇到了一些问题, 我意识到不可能从http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html多次执行SwingWorker线程 。Java中的SwingWorker线程

我的问题是,是否有可能创建同一个SwingWorker线程的新实例? 在代码在这里,我叫工作线程“工人”

SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>(){ 
    public void doInBackGround(){ 

    } 
}; 

是否有可能创造这个线程的多个实例,所以我可以把它不止一次?我试过类似

(new SwingWorker<Void, Void> worker).execute(); 

但这似乎不起作用。任何帮助将是appreicated!

+0

'但这似乎并不奏效。任何帮助都将得到更好的理解!“为了更好的帮助,尽快发布一个[SSCCE](http://sscce.org/),简短,可运行,可编译,在此之前检查[Oracle教程whats ](http:// docs .oracle.com/javase/tutorial/uiswing/concurrency/worker.html),我的观点不知道如何模拟你的un_know问题, – mKorbel

+1

从一个匿名类切换到一个真实类并创建多个实例? – Robin

+0

你的意思是创建一个扩展SwingWorker的类?我仍然可以在这个新类的实例上调用.execute()吗? – Shane

回答

2

每当你需要创建一个新的SwingWorker时,会出现什么问题?

如果您需要在需要多次运行的实例中存储某些状态,则可以使用Runnable或Callable接口并将其提供给SwingWorker执行。您必须每次创建SwingWorker,但Runnable或Callable实例可以相同。

在下面的示例中,每次创建工作者实例,但Runnable实例始终相同。

class Foo { 
    private final Runnable executeInBackground; 
    private final Runnable executeInDone; 

    public Foo(Runnable done, Runnable background) { 
    executeInDone = done; 
    executeInBackground = background; 
    } 

    public void execute() { 
    SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { 
     public void doInBackground() { 
      executeInBackground.run(); 
     } 

     public void done() { 
      executeInDone.run(); 
     } 
    }; 
    worker.execute(); 
    } 
} 
+0

不知道我完全理解你,任何时候我尝试使用上面的代码我得到的错误'无法实例化类型SwingWorker '我如何'使用Runnable或Callable接口并将其提供给SwingWorker执行' – Shane

+0

希望小代码示例会使事情更加清晰。 – oikku

+0

SwingWorker未被指定用于此作业,创建时将艰难且长时间运行的任务重定向到WorkersThread,而不是作为可重用对象,使用Executor作为paraller或同时运行,请注意,Executor和SwingWorker都不是goog设计的API,在基于Runnable.Thread或普通香草线程的标准工作线程中,错过了一堆重要的通知程序。线程 – mKorbel