如何监视Event Dispatch Thread队列?

时间:2016-06-15 17:28:18

标签: java swing awt event-dispatch-thread

我有一个沉重的java项目,它不能响应用户。我发现在事件调度线程中需要很长时间才能使我的项目工作缓慢。所以,我有两个问题:

  1. 如何监视事件派发线程并查看队列中的哪些事件以及哪些事件在事件派发线程中花费更多时间? (如您所知,invokeLater函数将事件插入到事件调度队列的末尾。我想监视整个事件调度队列)
  2. 如何将事件插入事件派发线程的第一个? (在这种情况下,GUI将响应)。

2 个答案:

答案 0 :(得分:1)

通常,缓慢是由无意中尝试从UI线程访问文件系统,网络或数据库的代码引起的。一旦找到原因,通常很容易修复SwingWorkers。

Replace the Event Dispatch Queue,其实现监视队列中的事件需要处理多长时间。

当一个事件花费太长时间时,新队列实现会记录EDT的堆栈跟踪 如果您只是习惯于在抛出异常时查看堆栈跟踪,请不要惊慌。新的实现不会杀死慢速事件或导致它们抛出异常,它只是向您显示在检测到无响应时EDT正在做什么。 查看打印的堆栈跟踪,找出如何将事件的缓慢部分移动到另一个线程中。

我相信Netbean的慢度检测器实现了非常相似的功能。

答案 1 :(得分:-1)

您需要提供更多详细信息......但是线程本身没有队列。您无法检查线程上正在等待的工作,您只能检查任何给定线程的状态(比如在线程池中)。

如果你有一个" work"需要排队等待最终由给定的"工人" (即线程)你必须自己实现。或者你可以使用一个演员系统,如AKKA,这听起来像你需要的那样