繁体   English   中英

EventQueue工作缓慢

[英]Slow work of EventQueue

我有一个带有gui的简单JAVA程序,它只会递增int变量并在JLabel中显示其值。 我通过使用Runnable类在其内部调用EventQueue.invokeLater()来创建用于适当(线程安全)更新JLabel的新线程,而runnable类只是运行方法

EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            label.setText("" + number);
        }
    });

当我运行程序时,正如预期的那样,标签的数量开始从1迅速增加到大约5000,但随后开始放缓,并且我开始看到此类标签​​的更新,例如100255、173735、235678以及它们之间的大停顿以及被阻止的GUI。 但是,当我不使用EventQueue.invokeLater()进行编译时,只需直接调用label.setText("" + number); 一切正常且完美,我可以看到标签上每个数字的变化都非常快。 但是我当然知道在那种情况下我的方法不是线程安全的。

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

可能是事件队列被阻塞了。 您可能希望查看合并事件以在对事件进行排队时删除多余的条目,其速度要比对它们进行出队和处理的速度快。

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

话虽如此,我隐约记得,GUI代码经过优化,不会尝试合并不会覆盖适当方法的事件,因此您的问题可能只是一个简单的待办事项。

您可以创建一个用于在组件上设置文本的自定义事件,而不是直接调用setText ,对其实现合并并使用它,以便在任何给定时间仅等待最新的文本。 如果执行此操作,并且要基于先前设置的内容设置文本,则最好保留该值,并始终从中设置GUI小部件,而不是使用getText调用GUI小部件的当前值。 否则,合并要困难得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM