11 七月 2008

SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()介绍

今天看了下MP3在线搜索器的源代码,发现里面出现了SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()这两个方法。以前做Swing事件响应的时候从来没有用过,所以网上查了下,大概明白他们的作用。

举个例子,比如单击按钮实现某些操作,我们一般使用ActionListener监听器来调用actionPerformed方法来完成按钮的功能。这样的做法一般来说没有问题,但是某些情况下会出现问题。比如单击按钮要执行很费时的操作,此时你的按钮就会始终处于按下的状态,而且导致界面其他的组件无法正常使用,好像界面死了一样。这是由于Swing不是线程安全的,它是单线程的设计,因此如果它处于某种费时的操作,由于单线程设计的缘故,会导致其他操作在当前功能未完毕之前无法启动。如何解决这类问题,就可以考虑使用SwingUtilities.invokeLater()和SwingUtilities.invokeAndWait()这两个方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块,即当前费时的操作不会影响Swing中的其他操作。如果你希望部件能够立即显示或重画,而处理代码在后台运行,那么你就可以使用invokeLater。invokeAndWait指的是当前线程阻塞,一直等待invokeAndWait中指定的代码执行完毕之后,才接着运行,这种方式用的不多。

没有评论: