Dlaczego SwingWorker zatrzymuje się nieoczekiwanie?

Chciałem wypróbować kilka pomysłówSwingWorker ponieważ nie używałem tego za dużo. Zamiast tego wpadłem na problem i nie mogę zrozumieć, co jest nie tak.

Oto krótkiSSCCE to pokazuje ten problem (znam tu ludzi jak SSCCE):

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

Więc mój program powinien utworzyć 3 SwingWorkers, którzy wypisują linię na ekranie, a następnie śpią przez określoną liczbę milisekund, a następnie ponownie drukują linię i ponownie śpią itd. TworzęSwingWorkers z wątku Swinga, bo inaczej nawet by się nie zaczęły.

Oczekiwany wynik to:

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)
.............

i tak dalej, w sumie 150 linii (3 pracowników x 50 iteracji dla każdego)

Zamiast tego otrzymuję wynik:

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 to wszystko. Tylko 3 linie. Po tym program kończy działanie. Nigdzie nie ma żadnych stacktracetry catch blok.

1). Gdzie jest pracownik ze snem 1200ms? Właściwie, jeśli zastąpię 1200 ms 1000 ms, to ten pracownik również drukuje 1 linię ... tak, tylko jedną. Dziwne...

2). Dlaczego pracownicy się zatrzymują? (i nie dostaję 150 linii rzeczy)

Uruchomiłem ten program za pomocąJRE 7 Aktualizacja 11 w systemie Windows 7 w wersji 64-bitowej.

PS: Jestem tego pewienbłąd wymieniony tutaj został naprawiony w tej wersji JRE, ponieważ otrzymuję 2 różne wartości (15 i 16) jako identyfikatory wątków drukowane na konsoli. To była pierwsza rzecz, którą podejrzewałem.

questionAnswers(4)

yourAnswerToTheQuestion