非常に奇妙な動作をする非常に単純なアプリケーションがあります。
これは基本的に SwingWorker の例ですが、ボタンを押すと、EDT がブロックされているかのように GUI が動作します。2 つを同時に起動でき、それらは並行して実行されます (実行時間はほぼ同じです) が、実行中にメニューがフリーズします。ランナブルでスレッドを使用すると、まったく同じ動作が発生します。また興味深いのは、ループが Thread.sleep に置き換えられた場合、GUI が適切に動作することです。
何か案は?
public class DummyFrame extends JFrame {
public DummyFrame() {
JMenuBar bar = new JMenuBar();
JMenu menu = new JMenu("File");
menu.add(new JMenuItem("TEST1"));
menu.add(new JMenuItem("Test2"));
bar.add(menu);
setJMenuBar(bar);
JButton button = new JButton("FOOBAR");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
final long start = System.currentTimeMillis();
SwingWorker<Void, Integer> testTask = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground()
throws Exception {
int k = 0;
for (int i=0; i<200000; i++) {
for (int j=0; j<100000; j++) {
if (i==j && i%10000 == 0)
k++;
}
}
System.out.println(k+" "+(System.currentTimeMillis()-start));
return null;
}
};
testTask.execute();
}
});
getContentPane().add(button);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
DummyFrame f = new DummyFrame();
f.setVisible(true);
}
});
}
}