2010-10-06 17 views
4

Я пытаюсь найти различия между SwingWorker execute() vs 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

Метод выполнения() вызывается в текущем потоке. Он планирует SwingWorker для выполнения в рабочем потоке и немедленно возвращается. В вашем случае основной поток выходит до запланированного рабочего потока, имеет возможность выполнить метод doInBackground(). Вы можете дождаться завершения SwingWorker с использованием методов get().

+0

Что относительно исключения? –

+0

Исключение происходит из-за того, что ваша программа уже завершена, когда рабочие запускаются. – Guillaume

+0

Как это решить? –

Смежные вопросы