SwingUtilities中invokeLater和invokeAndWait的介绍 - 编程入门网
SwingUtilities中invokeLater和invokeAndWait的介绍时间:2011-06-21 BlogJava zht在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只 能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用 paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方 法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用。 Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比 如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件 监听器的actionPerformed方法中来实现该列表的更新,从事件派发线程以外的 线程中更新Swing组件是不正常的。 有时需要从事件派发线程以外的线程中更新Swing组件,例如,在 actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要 很长时间才能看到更新的列表,按钮会长时间保持按下的状态只到 actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因 为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在 独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件 派发线程去派发其他的事件。 SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使 事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时, 就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代 码块。 只有从事件派发线程才能更新组件。 程序示例:更新组件的错误方法
SwingUtilities中invokeLater和invokeAndWait的介绍(2)时间:2011-06-21 BlogJava zht错误分析:在actionPerformed中,监听器把按钮的允许状态设置为false, 由于是在事件派发线程上调用actionPerformed,所以setEnabled是一个有效的 操作,但是在GetInfoThread中设置进度条是一个危险的做法,因为事件派发线 程以外的线程更新了进度条,所以运行是不正常的。 1、invokeLater使用
2、invokeAndWait 与invoikeLater一样,invokeAndWait也把可运行对象排入事件派发线程的队 列中,invokeLater在把可运行的对象放入队列后就返回,而invokeAndWait一直 等待知道已启动了可 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |