2010-10-06 158 views
4

我試圖找到SwingWorker執行()與doInBackground()之間的區別,所以我寫了這個簡單的程序來測試差異。SwingWorker不能正常工作

public static void main(String[] args) { 
    // TODO code application logic here 
    for(int i=0;i<10;i++){ 
     try { 
      new Worker().execute(); 
     } catch (Exception ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

public static class Worker extends SwingWorker<Void,Void>{ 

    @Override 
    protected Void doInBackground() throws Exception { 
     System.out.println("Hello"); 
     return null; 
    } 

} 

當我運行這個程序,我得到了以下異常:

Exception in thread "AWT-Windows" java.lang.IllegalStateException: Shutdown in progress 
    at java.lang.ApplicationShutdownHooks.add(ApplicationShutdownHooks.java:39) 
    at java.lang.Runtime.addShutdownHook(Runtime.java:192) 
    at sun.awt.windows.WToolkit.run(WToolkit.java:281) 
    at java.lang.Thread.run(Thread.java:619) 

然而,當我試圖使用doInBackground()

new Worker().doInBackground(); 

節目作品和打印預期的結果。那麼我的錯誤是什麼?我應該使用doInBackground()方法,因爲我已經閱讀過它不應該使用它。

由於

回答

8

的execute()方法被調用在當前線程上。它調度SwingWorker以在工作線程上執行並立即返回。在你的情況下,主線程在計劃的工作線程有機會執行doInBackground()方法之前退出。您可以使用get()方法等待SwingWorker完成。

+0

異常情況如何? – 2010-10-06 06:30:41

+0

發生異常是因爲您的程序在工作人員啓動時已經退出。 – Guillaume 2010-10-06 06:45:34

+0

那麼如何解決呢? – 2010-10-06 07:09:46