Warum stoppt SwingWorker unerwartet?

Ich wollte ein paar Ideen ausprobierenSwingWorker da ich es nicht zu oft benutzt habe. Stattdessen bin ich auf ein Problem gestoßen und kann nicht herausfinden, was los ist.

Hier ist eine kurzeSSCCE das demonstriert dieses Problem (ich kenne Leute hier wie SSCCEs):

import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class SwingWorkerTest
{
    public static void main (String[] args)
    {
        SwingUtilities.invokeLater (new Runnable ()
        {
            @Override
            public void run ()
            {
                new MySwingWorker (500).execute ();
                new MySwingWorker (900).execute ();
                new MySwingWorker (1200).execute ();
            }
        });
    }
}

class MySwingWorker extends SwingWorker<Void, Void>
{
    private int ms;

    public MySwingWorker (int ms)
    {
        this.ms = ms;
    }

    @Override
    protected Void doInBackground()
    {
        Thread t = Thread.currentThread ();

        for (int i = 0; i < 50; i++)
        {
            try
            {
                Thread.sleep (ms);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace ();
            }

            System.out.println ("I am thread with " + ms + " sleep in iteration " + i + ": " + t.getName () + " (" + t.getId () + ")");
        }

        return null;
    }
}

Also sollte mein Programm 3 SwingWorker erstellen, die eine Zeile auf dem Bildschirm drucken, dann für die angegebene Anzahl von Millisekunden schlafen und dann die Zeile erneut drucken und erneut schlafen usw. Ich erstelle dieSwingWorkers aus Swings Thread, da sie sonst gar nicht erst anfangen würden.

Die erwartete Ausgabe ist also:

I am thread with 500 sleep in iteration 0: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 0: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 1: SwingWorker-pool-1-thread-1 (15)
I am thread with 1200 sleep in iteration 0: SwingWorker-pool-1-thread-3 (17)
I am thread with 500 sleep in iteration 2: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 1: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 3: SwingWorker-pool-1-thread-1 (15)
I am thread with 1200 sleep in iteration 1: SwingWorker-pool-1-thread-3 (17)
I am thread with 500 sleep in iteration 4: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 2: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 5: SwingWorker-pool-1-thread-1 (15)
I am thread with 500 sleep in iteration 6: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 3: SwingWorker-pool-1-thread-2 (16)
I am thread with 1200 sleep in iteration 2: SwingWorker-pool-1-thread-3 (17)
I am thread with 500 sleep in iteration 7: SwingWorker-pool-1-thread-1 (15)
.............

und so weiter für insgesamt 150 Zeilen (3 Arbeiter x 50 Iterationen für jede)

Stattdessen erhalte ich folgende Ausgabe:

I am thread with 500 sleep in iteration 0: SwingWorker-pool-1-thread-1 (15)
I am thread with 900 sleep in iteration 0: SwingWorker-pool-1-thread-2 (16)
I am thread with 500 sleep in iteration 1: SwingWorker-pool-1-thread-1 (15)

Und das ist es. Nur 3 Zeilen. Danach wird das Programm beendet. Davon gibt es keinen Stacktracetry catch Block.

1). Wo schläft der Arbeiter mit den 1200ms? Tatsächlich, wenn ich 1200ms durch 1000ms ersetze, druckt dieser Arbeiter auch 1 Zeile ... ja, nur eine. Seltsam...

2). Warum hören die Arbeiter auf? (und ich bekomme nicht 150 Zeilen Zeug)

Ich habe dieses Programm mit ausgeführtJRE 7 Update 11 unter Windows 7 64-Bit.

PS: Da bin ich mir ziemlich sicherder hier erwähnte Fehler wurde in dieser Version von JRE behoben, da ich 2 verschiedene Werte (15 und 16) als Thread-IDs auf der Konsole ausgegeben bekomme. Dies war das erste, was ich vermutete.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage