Swing中的线程
Swing作为一个完整的UI解决方案,包含了一个GUI程序所拥有的方方面面,当然包括作为普通程序也好,作为GUI程序也好,作为Web程序等等程序都共有的线程概念。
Swing中的线程有三种:初始线程,事件线程,工作线程
这三种线程基本上包括了让一个GUI完美工作的方方面面,首先,初始线程被用来创建GUI组件、资源加载和启动GUI组件,众所周知,Swing是事件驱动的,所以当UI出现了之后,初始线程就完成了它的使命,并将接力棒交给了事件线程,Event Dispatch Thread,这个时候所有组件的事件行为都交给了这个线程去处理,当然我们自己也要需要用线程来运行许多任务,优秀的GUI程序是绝不能让界面被卡死不动的,那会让用户崩溃,所以这个时候就需要工作线程了,也可以说是在背后运行的线程,这种线程是劳动阶级,任劳任怨的执行者长时间的工作。
初始线程的写法很简单,这样就可以了:
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- initGUI();
- showGUI();
- }
- }
但是Applet中,你可能需要调用SwingUtilities.invokeAndWait这个方法,要是init方法返回了,浏览器开始展现Applet,但是GUI的创建还在thread中,出错也是可想而知的。
至于invokeLater和invokeAndWait这两个线程的简单点的区别就是invokeLater是异步的,你不知道它什么时候会开始执行,invokeAndWait则是同步的,它会等到动作执行完成之后才返回。
Event Dispatch Thread不是线程安全的,所以要用线程来与它打交道要注意了,同步问题总是让人头痛。
在1.5之前应该说工作线程都是由开发人员自己去定义的,但是现在Swing推荐了SwingWorker这个类,包括Swing最新的符合JSR标准的Swing AppFramework也使用了SwingWorker这个类来处理所有在GUI背后做的事情。
了解了Swing中的线程定义,能够让我们更好的写出优美的基于Swing的GUI程序。
【编辑推荐】