【问题标题】:Overriding the AWT Event Dispatch Thread覆盖 AWT 事件调度线程
【发布时间】:2014-08-10 21:40:17
【问题描述】:

我正在构建一个 java 分析工具,该机制要求应用程序的所有 Thread 实例都被替换为子类“ProfilingThread”,它覆盖了一些线程的行为以实现分析功能。

鉴于 Java 应用程序的源代码,我可以简单地将所有“Thread”类重构为“ProfilingThread”类。但是,AWT 事件分派器的线程不是由用户代码实例化的,而是在调用 AWT 函数时自主创建的。

如何将 AWT 事件调度程序的 Thread 实例替换为 ProfilingThread 实例?

欢迎所有想法和批评。

【问题讨论】:

  • 抱歉,已添加主题问题。

标签: java multithreading awt event-dispatch-thread


【解决方案1】:

首先提出一点批评:在生产级应用程序中破解 Java 内部结构通常不是一个好主意。

更好的解决方案是为事件调度线程的任何实例添加专门的处理,并且只分析您自己的类。 java的其他部分也很可能会启动其他线程,这些线程也不会从您的ProfilingThread扩展......

但如果你要更改 AWT 事件调度线程:

事件调度线程是系统事件队列中的java.awt.EventDispatchThread实例,可通过以下方式获得

Toolkit.getDefaultToolkit().getSystemEventQueue()

要替换线程,您必须使用您的ProfilingThread 重新实现java.awt.EventDispatchThread,或者更好地扩展EventDispatchThread 并添加您的分析功能。

然后您必须使用反射设置该字段,因为它是私有的并且通常不能从外部更改。 (有很多关于如何做到这一点的例子)

作为参考:http://developer.classpath.org/doc/java/awt/EventQueue-source.html

【讨论】:

  • 你说得对,我已经后悔采取了 hack java internals 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 2010-10-04
  • 2019-06-02
  • 2012-12-24
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多