Я хотел попробовать некоторые идеи, используя SwingWorker
, так как я не использовал его слишком много. Вместо этого у меня возникла проблема, и я не могу понять, что случилось.Почему SwingWorker неожиданно останавливается?
Вот краткий SSCCE, который демонстрирует эту проблему (я знаю, что люди здесь, как 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;
}
}
Так что моя программа должна создать 3 SwingWorkers, которые печатают линию на экране, а затем спать в течение указанного количества миллисекунд а затем снова напечатать строку и снова заснуть и т. д. Я создаю SwingWorker
s из потока Swing, потому что иначе они даже не начнут.
Таким образом, ожидаемый результат:
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)
.............
и так далее в общей сложности 150 линий (3 рабочих х 50 итераций для каждого)
Вместо этого, выход я получаю:
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)
И все. Всего 3 линии. После этого программа выйдет. Там нет stacktrace от этого блока try catch
.
1). Где рабочий со сном 1200 мс? На самом деле, если я заменяю 1200 мс на 1000 мс, тогда этот рабочий также печатает 1 строку ... да, только один. Weird ...
2). Почему рабочие останавливаются? (и я не получаю 150 строк)
Я запустил эту программу, используя JRE 7 Обновление 11 на Windows 7 64-бит.
PS: Я уверен, что the bug mentioned here был исправлен в этой версии JRE, так как я получаю 2 различных значения (15 и 16) в качестве идентификаторов потоков, напечатанных на консоли. Это было первое, что я подозревал.
+1 Выполняется ли 'doInBackground'' SwingWorker' в потоке без демона? –
@ Eng.Fouad: посмотрите править. Измените: или посмотрите на источник, как вы это сделали. 1+ к вашему ответу! –