如何以编程方式报告AWT/Swing事件队列长度



理想情况下,答案将与平台无关,但特定于平台,特别是Oracle JVM,也很有用。我正在进行的项目仍然在运行一个版本6的JVM。

这种特殊的需要与一个不时"冻结"的GUI有关。我很清楚在EDT上做GUI上的工作。该程序在Windows上运行良好,但在迁移到Linux后,这些"奇怪"的GUI问题开始发生。实际上,这个问题已经发生在两个应用程序上,都是在Windows迁移到Linux之后。JVisualVM显示了超过1000万个java.awt.EventQueueItem对象。人们怀疑AWT队列的增长速度比在Linux上提供的要快,所以我们的想法是在应用程序上设置一个AWT队列长度指示器,看看它在队列增长/收缩时显示什么。

谷歌搜索发现了这一点,但它对队列进行了线性扫描。也许还有更好的办法?

有趣的主题。我已经研究了EventQueue代码,虽然我还没有解决你的问题,但我可能有一些有用的指针:

  1. Oracle对EventQueue的实现不保留大小变量,因此,除非您完全控制EventQueue(请参阅3),否则在使用Oracle的JRE时,您将无法比对队列进行线性扫描做得更好
  2. 您可以编写自己的EventQueue(复制粘贴Oracle的实现加上一些调整**可能是最简单的),并使用EventQueue.push(EventQueue)安装自己的实现。队列中的所有事件都将转移到您的队列中,因此您可以在将它们发布到队列时对其进行计数。不幸的是,这仍然是一个线性扫描,但至少现在它是独立于平台的
  3. 或者,您可以在创建原始事件队列后尽快安装自己的EventQueue实现(请参阅2)(在包含主方法的类开头的静态代码块中执行此操作)。然后,您的实现可以在发布所有事件时对其进行计数,并且当您想知道大小时,不必扫描队列。你只需要希望没有其他人把自己的EventQueue推到你的上面;)

**一些调整:我还没有尝试过,但我会去掉所有公共/受保护的静态代码(引用这些方法/变量的每个人都使用java.awt.EventQueue,你也可以),添加大小变量,并用以下四种方法更新这个变量:postEvent(AWTEvent, int)getNextEventPrivate()getNextEvent(int)removeSourceEvent(Object, boolean)

此修改的一个大问题是,EventQueue对具有默认可见性的AWT方法(例如,Toolkit.getEventQueue()Component.getAccessControlContext())进行了一些调用,由于您的实现将在不同的包中,因此不允许调用这些方法。您必须针对每种情况分别找到解决方法。

相关内容

  • 没有找到相关文章

最新更新