首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EventQueue的慢工作

EventQueue的慢工作
EN

Stack Overflow用户
提问于 2013-09-25 19:06:41
回答 1查看 535关注 0票数 0

我有一个带有gui的简单JAVA程序,它只增加int变量,并在JLabel中显示它的值。我创建新线程用于正确(线程安全)更新JLabel,方法是使用Runnable类调用它内部的EventQueue.invokeLater(),运行方法就是这样做的。

代码语言:javascript
复制
EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            label.setText("" + number);
        }
    });

当我运行程序时,正如预期的那样,label的数量开始快速增长,从1增长到大约5000,但随后它开始放缓,我开始看到这样的标签更新,比如100255,173735,235678,以及它们之间的大停顿与阻塞的GUI。但是,当我不使用EventQueue.invokeLater()进行编译时,只要直接调用label.setText("" + number);,一切都工作得很好,而且我可以看到标签的每一个数字是如何变化得非常快的。但我当然意识到,在这种情况下,我的方法不是线程安全的。

有什么问题吗?在我看来,EventQueue的工作速度很慢什么的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-25 19:09:28

可能,事件队列被阻塞了。当您正在排队事件时,您可能需要考虑合并这些事件以删除冗馀项,而不是将它们从队列中删除和激活。

每次将事件添加到队列中时,都会查询现有事件,以查看它们是否将新事件与自身合并。随着队列的备份,越来越多的事件必须被如此查询,并且系统越来越落后。这对于鼠标事件是有用的,但是在这样一个简单的(和人为的)情况下,它可能是有害的。

尽管如此,我仍然模糊地记得,GUI代码是经过优化的,以避免尝试合并不覆盖适当方法的事件,因此您的问题可能只是一个简单的待办事项。

与直接调用setText不同,您可以创建一个自定义事件来设置组件上的文本,为它实现合并并使用它,以便在任何给定的时间只有最近的文本被挂起。如果您这样做,并且希望根据先前设置的内容来设置文本,最好保留值,并始终从该值中设置GUI小部件,而不是使用getText来回忆GUI小部件的当前值。否则,合并要困难得多。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19013185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档