Swing中应用多线程
昨天用Swing写了个计时器,功能就类似于秒表。实现起来肯定是需要使用线程的。
Swing中应用多线程需要十分当心,很容易导致界面没有响应。原因很简单,Swing的事件都是由the event-dispatching thread处理的,一看定冠词the,就知道只有一个特定的线程,所以一旦在事件处理程序中发生阻塞,整个Swing就会失去响应。Swing的事件处理机制,其实就是Worker Pattern(参见《Java多线程设计模式》),只不过只有一个Worker——the event-dispatching thread,这样就省去了共享互斥,提高了程序性能。用户界面上发生的所有事件都会放入一个事件队列,然后the event-dispatching thread会从事件队列中一个一个的获取事件实例,并指定给相应的ActionListener处理。
要实现计时器的功能,必须有一个线程,每隔一定的时间更新界面时间的显示,单纯依赖ActionListener+Thread的方式会造成界面没有相应。最好的方法是使用javax.swing.Timer来完成定时执行的功能。
Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
......
}
});
上段代码每隔0.1秒执行actionPerformed中的代码,对应于计时器来说,就是去修改界面上时间的显示。