4 Stimmen

SwingWorker funktioniert nicht wie erwartet

Ich versuche, die Unterschiede zwischen SwingWorker execute() vs doInBackground() zu finden, also habe ich dieses einfache Programm geschrieben, um den Unterschied zu testen.

 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;
    }

}

Wenn ich dieses Programm ausführe, erhalte ich die folgende Ausnahme:

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)

Als ich jedoch versuchte, die Funktion doInBackground() zu verwenden

new Worker().doInBackground();

das Programm funktioniert und gibt das erwartete Ergebnis aus. Was ist also mein Fehler? und sollte ich die doInBackground() Methode verwenden, da ich gelesen habe, dass sie nicht verwendet werden sollte.

Gracias

8voto

Suresh Kumar Punkte 10331

Die Methode execute() wird im aktuellen Thread aufgerufen. Sie plant SwingWorker für die Ausführung auf einem Worker-Thread ein und kehrt sofort zurück. In Ihrem Fall wird der Haupt-Thread beendet, bevor der eingeplante Worker-Thread die Möglichkeit hat, auszuführen doInBackground() Methode. Sie können warten, bis der SwingWorker fertig ist, indem Sie die get() Methoden.

0 Stimmen

Die Ausnahme tritt auf, weil Ihr Programm bereits beendet ist, wenn die Worker gestartet werden.

1 Stimmen

Wenn Sie Thread.sleep(2000L); nach der for-Schleife hinzufügen, erhalten Sie das erwartete Ergebnis.

0 Stimmen

Sehen Sie sich die API-Dokumentation an download.oracle.com/javase/6/docs/api/javax/swing/ . Sie können die Methode get() verwenden, um zu warten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X