我有一個非常簡單的應用程序,帶有非常奇怪的行爲。在啓動線程或執行計算的SwingWorker時擺動僞塊
它本質上是SwingWorker的例子,但是當我按下按鈕時,GUI的行爲就像EDT被阻塞一樣。我可以同時啓動兩個並行運行(運行時間幾乎相同),但菜單在運行時仍會凍結。當我使用可運行的線程時,會發生完全相同的行爲。另外有趣的是,如果循環被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);
}
});
}
}
更具體地說,我認爲你的JVM進程中有一個線程運行,這就是爲什麼它不一定會使整個系統癱瘓 - 只是運行在該進程中的JVM。即使你不使用`SwingWorker` - 只需使用一個普通的`Thread` - 你可能會遇到同樣的問題。處理這個問題的正確方法是在緊密循環內調用Thread.yield(),這將使其他線程有機會運行。 – 2011-02-03 01:28:50