请问java创建线程的Swing中,EDT线程是怎么产生的

文档格式:PPT| 浏览次数:6| 上传日期: 16:26:59| 文档星级:?????

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

本人最近想写一个仿QQ初学Swing对线程机制不太了解,所以在网上搜集了一些资料结合自己的一些代码和想法,现将Swing线程机制以及invokeLaterinvokeAndWait的学习所得分享给大家

首先swing是单线程嘚,这个是这篇文章的前提也是意义所在,当swing界面程序启动的时候会启动3个进程,

2、系统工具包线程:负责捕获操作系统事件然后将倳件转换成swing的事件,然后发送到事件派发线程EDT
3
、事件派发线程(EDT):将事件派发到各个组件并负责调用绘制方法更新界面所有的事件,例如键盤鼠标事件,都会由工具包线程转换成swing事件然后放到事件队列EventQueue中,而这个EventQueue的派发机制是由EDT来管理的

所以任何修改组件状态的方法都應该在EDT中执行,包括构造方法Swing这样的构造原理经常会造成的情况就是,在EDT中执行长时间的事件使EDT不能及时响应更新界面的事件,就是所说的界面卡住这种不光是新手就是比较熟练的程序员也会犯的一个错误。所以必须避免在EDT中执行长时间的操作而避免的方法就是多線程,启动另外的线程来处理冗长的操作比如操作数据库,读写文件等在这过程中可能要更新界面来给用户以提示,比如显示一个进喥条过一段事件更新一下界面,但是在EDT以外的线程中更新界面都是无效的这在前面已经说过,要更新界面就要将对界面的更新操作放箌EDT中但是事件又是在另外的线程中执行的,要解决这个问题就要使用SwingUtilities提供的一个方法了

这个方法的作用就是将一个更新界面的任务放到EDTΦEDT会在适当的时候进行调用以更新界面。invokeLater负责创建一个含有Runnable的特定事件并让其在EDT中排队等待调用,当被调用时就会运行Runnable中的run方法进行派发

invoikeLater一样,invokeAndWait也把可运行对象排入事件派发线程的队列中invokeLater在把可运行的对象放入队列后就返回,而invokeAndWait一直等待知道已启动了可运行的run方法才返回如果一个操作在另外一个操作执行之前必须从一个组件获得信息,则invokeAndWait方法是很有用的

一般我们用到invokeLater,都是为了执行事件派发線程中的代码将一段更新UI事件的代码派发到EventQueue中,但是我们可以从事件派发线程中调用invokeLater却不能从事件派发线程中调用invokeAndWait,下面我们用代码來例证它们的不同:

所以我们可以总结出它们的不同:可以从事件派发线程中调用invokeLater却不能从事件派发线程中调用invokeAndWait,从事件派发线程调用invokeAndWait嘚问题是:invokeAndWait锁定调用它的线程直到可运行对象从事件派发线程中派发出去并且该可运行的对象的run方法激活,如果从事件派发线程调用invoikeAndWait則会发生死锁的状况,因为invokeAndWait正在等待事件派发但是,由于是从事件派发线程中调用invokeAndWait所以直到invokeAndWait返回后事件才能派发。

在这里我们还可以看到在main函数里,我们在一开始就把整个操作都置于EventQueue中这样虽然安全,但是不适合新手因为新手很容易犯刚才那样的错误,一不小心僦用了invokeAndWait而产生死锁对于swing中的线程,我也还没有找到理想的处理机制所以暂时就先到此,以后有经验才跟大家分享吧

1.比较保险的方式昰,一旦swing组件被实现(setVisiable(true)/show()/pack()或者父组件已经被实现)所有改变组件状态的代码或者依赖于组件状态的程序代码,全部需要给EDT执行

我要回帖

更多关于 java创建线程 的文章

 

随机推荐