SwingWorker не работает должным образом - PullRequest
4 голосов
/ 06 октября 2010

Я пытаюсь найти различия между SwingWorker execute () и doInBackground (). Поэтому я написал эту простую программу, чтобы проверить разницу.

 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 (), поскольку я прочитал, что он не должен использоваться.

Спасибо

1 Ответ

8 голосов
/ 06 октября 2010

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

...