SwingWorker
あまり使っていないので色々と試してみたかったのです。代わりに、問題が発生し、何が問題なのかわかりません。
この問題を示す短いSSCCEを次に示します (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;
}
}
したがって、私のプログラムは、画面に行を出力し、指定されたミリ秒数の間スリープし、行を再度出力して再びスリープする 3 つの SwingWorker を作成する必要がありますSwingWorker
。
したがって、期待される出力は次のとおりです。
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 ワーカー x 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行。この後、プログラムは終了します。そのブロックのどこにもスタックトレースはありませんtry catch
。
1)。1200 ミリ秒のスリープのワーカーはどこにありますか? 実際、1200ms を 1000ms に置き換えると、このワーカーも 1 行を出力します... はい、1 行だけです。変...
2)。なぜ労働者は止まるのですか?(そして私は150行のものを手に入れません)
Windows 7 64 ビットで JRE 7 Update 11を使用してこのプログラムを実行しました。
PS:コンソールに表示されるスレッド ID として 2 つの異なる値 (15 と 16) を取得するため、ここで言及したバグはこのバージョンの JRE で修正されたと確信しています。これは私が最初に疑ったことでした。