swing多线程编程归纳

Swing本身的界面绘制单线程的。也就是只有一个事件分派线程负责处理事件处理方法,保证了Swing本身的线程安全。但是如果存在一个很复杂耗时的任务,这样的处理方法就会造成界面的无响应甚至crash。所以Swing提供了SwingUtilities类的两个方法:invokeLater/invokeAndWait。
invokeLater:异步提交执行代码给事件派发线程,代码立即返回,不会等待代码执行完毕。
invokeAndWait:同步提交执行代码给事件派发线程,等到代码执行完再返回
(SWT中也有类似的机制对应的是:asyncExec和syncExec)

SwingWorker类用来实现后台线程操作,和上面的不同,SwingWorker在创建时会使用一个独立的线程(而不是在事件派发线程)执行相应的代码,然后可以通过get()方法获得执行结果。如果启动worker后马上要求结果的话,Swing同样会阻塞直到得到处理结果为止。

参考:
Swing单线程开发引起的问题
编写多线程Java应用程序常见问题
线程与Swing(英文)
SWT中处理多线程

Comments are closed.