当前位置: 技术问答>java相关
一个非常不明白的Swing问题
来源: 互联网 发布时间:2015-09-05
本文导语: 我遇到一个很难发现的问题,我在Swing中用到了多线程的问题(但我认为Swing可以使用多线程,我现在也这样认为),问题是Swing偶尔会不知不觉得关闭,我不明白,而且不抛任何异常,另外这个机率太小,使用四台计...
我遇到一个很难发现的问题,我在Swing中用到了多线程的问题(但我认为Swing可以使用多线程,我现在也这样认为),问题是Swing偶尔会不知不觉得关闭,我不明白,而且不抛任何异常,另外这个机率太小,使用四台计算机进行测试两三天,只在一台计算机上发现一次,它的计算机配置是CPU4,请大家帮我出出主意,或如果有遇到该问题的同僚一起来来谈谈经过
|
Swing组件只有少量方法,如setText是线程安全的,你的线程有对Swing组件操作完全可能引起Swing的随机崩溃。建议用EventQueue的invokeLater来调用你的线程,这样会由系统来决定同步问题。Core Java 卷2中就有一个非常不错的例子。如下
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class SwingThreadTest
{ public static void main(String[] args)
{ JFrame frame = new SwingThreadFrame();
frame.show();
}
}
class SwingThreadFrame extends JFrame
{ public SwingThreadFrame()
{ setTitle("SwingThread");
setSize(400,300);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
model = new DefaultListModel();
JList list = new JList(model);
JScrollPane scrollPane = new JScrollPane(list);
JPanel p = new JPanel();
p.add(scrollPane);
getContentPane().add(p, "South");
JButton b = new JButton("Good");
b.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent event)
{ new GoodWorkerThread(model).start();
}
});
p = new JPanel();
p.add(b);
b = new JButton("Bad");
b.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent event)
{ new BadWorkerThread(model).start();
}
});
p.add(b);
getContentPane().add(p, "North");
}
private DefaultListModel model;
}
class BadWorkerThread extends Thread
{ public BadWorkerThread(DefaultListModel aModel)
{ model = aModel;
generator = new Random();
}
public void run()
{ while (true)
{ Integer i = new Integer(generator.nextInt(10));
if (model.contains(i))
model.removeElement(i);
else
model.addElement(i);
yield();
}
}
private DefaultListModel model;
private Random generator;
}
class GoodWorkerThread extends Thread
{ public GoodWorkerThread(DefaultListModel aModel)
{ model = aModel;
generator = new Random();
}
public void run()
{ while (true)
{ final Integer i = new Integer(generator.nextInt(10));
EventQueue.invokeLater(new Runnable()
{ public void run()
{ if (model.contains(i))
model.removeElement(i);
else
model.addElement(i);
}
});
yield();
}
}
private DefaultListModel model;
private Random generator;
}
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class SwingThreadTest
{ public static void main(String[] args)
{ JFrame frame = new SwingThreadFrame();
frame.show();
}
}
class SwingThreadFrame extends JFrame
{ public SwingThreadFrame()
{ setTitle("SwingThread");
setSize(400,300);
addWindowListener(new WindowAdapter()
{ public void windowClosing(WindowEvent e)
{ System.exit(0);
}
} );
model = new DefaultListModel();
JList list = new JList(model);
JScrollPane scrollPane = new JScrollPane(list);
JPanel p = new JPanel();
p.add(scrollPane);
getContentPane().add(p, "South");
JButton b = new JButton("Good");
b.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent event)
{ new GoodWorkerThread(model).start();
}
});
p = new JPanel();
p.add(b);
b = new JButton("Bad");
b.addActionListener(new ActionListener()
{ public void actionPerformed(ActionEvent event)
{ new BadWorkerThread(model).start();
}
});
p.add(b);
getContentPane().add(p, "North");
}
private DefaultListModel model;
}
class BadWorkerThread extends Thread
{ public BadWorkerThread(DefaultListModel aModel)
{ model = aModel;
generator = new Random();
}
public void run()
{ while (true)
{ Integer i = new Integer(generator.nextInt(10));
if (model.contains(i))
model.removeElement(i);
else
model.addElement(i);
yield();
}
}
private DefaultListModel model;
private Random generator;
}
class GoodWorkerThread extends Thread
{ public GoodWorkerThread(DefaultListModel aModel)
{ model = aModel;
generator = new Random();
}
public void run()
{ while (true)
{ final Integer i = new Integer(generator.nextInt(10));
EventQueue.invokeLater(new Runnable()
{ public void run()
{ if (model.contains(i))
model.removeElement(i);
else
model.addElement(i);
}
});
yield();
}
}
private DefaultListModel model;
private Random generator;
}
|
如果你看一看一些多线程讲的比较多的书,你就会发现,由于swing 不保证线程安全性,swing的大多数的方法是不能被同步的方法。
好在,已经游人提供了对于这种问题打解决方案。(我看的时《java专业变成指南》
好在,已经游人提供了对于这种问题打解决方案。(我看的时《java专业变成指南》
|
发现一次,不代表没有问题,既然有问题,肯定还会出现第2、3、4...次。
建议再测试一段时间,如果还有这个问题,那就要考虑考虑了。
建议再测试一段时间,如果还有这个问题,那就要考虑考虑了。