gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:54 28 4
gpt4 key购买 nike

理想情况下,答案将与平台无关,但特定于平台(尤其是 Oracle JVM)也很有用。我正在处理的项目仍在运行版本 6 JVM。

特殊需求与不时“卡住”的 GUI 有关。我很清楚在 EDT 上进行 GUI 工作。该程序在 Windows 上运行良好,但在转移到 Linux 后,这些“奇怪”的 GUI 问题开始发生。实际上,这个问题已经发生在两个应用程序上,都是在从 Windows 迁移到 Linux 之后。 JVisualVM 显示超过 1000 万个 java.awt.EventQueueItem 对象。怀疑是 AWT 队列的增长速度超过了它在 Linux 上的服务速度,因此我们的想法是在应用程序上放置一个 AWT 队列长度指示器,并查看它在队列增长/收缩时显示的内容。

谷歌搜索发现 this ,但它对队列进行线性扫描。也许有更好的方法?

最佳答案

有趣的主题。我已经稍微研究了 EventQueue 代码,虽然我没有解决您的问题,但我可能会提供一些有用的指示:

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

** 一些调整:我没试过这个,但我会去掉所有公共(public)/ protected 静态代码(每个引用这些方法/变量的人都使用 java.awt.EventQueue,等等can you), 添加大小变量并在以下四种方法中更新此变量:postEvent(AWTEvent, int), getNextEventPrivate(), getNextEvent(int) removeSourceEvent(Object, boolean)

此修改的一个大问题是 EventQueue 以默认可见性调用 AWT 方法(例如,Toolkit.getEventQueue()Component.getAccessControlContext()),您不能调用它,因为您的实现将在不同的包中。您必须针对每种情况分别找到解决方法。

关于java - 如何以编程方式报告 AWT/Swing 事件队列长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18153613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com