SwingUtilities类中的invokeLater()和invokeAndWait()方法理解

本文介绍了SwingUtilities的invokeLater()和invokeAndWait()方法在Swing线程机制中的作用。讲解了Swing的三种线程类型,强调了EDT在事件调度中的重要性。invokeLater()用于异步更新UI,而invokeAndWait()则同步执行,可能导致阻塞。文章通过示例代码说明了如何避免UI界面阻塞和线程安全问题。
摘要由CSDN通过智能技术生成

      在理解SwingUtilities类中的.invokeLater()和invokeAndWait()两种方法之前,需要先了解清楚Swing线程机制。Swing程序通常包括三种类型的线程:①初始化线程(Initial Thread);②任务线程(Work Thread);③事件调度线程(Event Dispatch Thread,EDT)。

      初始化线程主要负责启动程序的UI界面,一旦UI界面启动完成,初始化线程的工作就结束了,每个程序都是从main方法开始执行,该方法一般就是运行在初始化线程上。工作线程主要负责执行和界面无直接关系的耗时任务和输入/输出密集型操作,任何高染或延迟UI事件的处理都会由该线程完成。EDT主要负责绘制和更新界面,并响应用户的输入,每个Swing程序都会有一个EDT,通过EDT管理一个事件队列,用户每次对界面的更新请求(如键盘、鼠标移动等事件)都会排到事件队列中等待EDT的处理,EDT会将队列中的事件按照顺序派发给相应的事件监听器,并且调用事件监听器中的回调函数。

      通过上面的内容可以了解到EDT管理了一个事件队列,并且它们是按照顺序派发的。由于事件派发是单线程的操作,所以只有等待前面事件监听器的回调函数执行完毕,才能够执行组件更新的操作以及继续派发后面的事件。这样导致的一个后果就是:当在一个事件监听回调函数中做了耗时的操作就会导致UI界面因此停住,并且UI界面上所有的控件失效(不可触发)。针对这样的问题,我们想到的解决办法就是将事件处理函数中的耗时

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值