2013-04-18 39 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