找到有多少Runnables在EventQueue上等待

时间:2012-12-10 00:03:02

标签: java multithreading event-dispatch-thread eventqueue

有没有办法确定当前在EventQueue中排队的Runnables数量?...我的意思是系统EventQueue,即要在EDT中运行的所有Runnables。可能会弄乱队列吗?

我想要做的是确定GUI Runnables的优先级...如果出现用户驱动的GUI事件,它应该立即执行,在任何排队的Runnables之前跳过队列(顺便说一下,这些都将是关注修改不可见的Swing组件.NB最新的Swing指南:必须在EDT上更改所有Swing组件,即使是隐藏的。)

有一个简单的,有人工作的队列有“紧急”和“非紧急”Runnables的可能性:每个Runnable可以递增一个“可观察的”AtomicInteger计数器,然后执行每个可以减少它...和一个BlockingQueue如果BlockingQueue大小变为1(或者可能是2或0),将确保非紧急Runnables仅提交给“invokeLater”。 Instinct让我觉得这样的安排会引入相当多的延迟。

另外,能够直接干扰EDT自己的队列会更好。我应该推出自己的EDT队列吗?这可能吗?

NB显然必须从非EDT线程观察EDT队列的状态(或干预它)。我所知道的可能存在“线程可见性”问题......

1 个答案:

答案 0 :(得分:1)

我不认为这是可能的。代码可用。您可以覆盖它甚至重写它,但实际的EventQueue是由系统设置的;除非通过一些定义的方法,否则你无法实现它。您当然可以自己设置并使用它,但所有Swing组件都将使用官方EQ,您最终将进行多线程Swing。 (根据个人经验,这种方法非常有效,除了偶尔的,加重的,令人费解的奇怪行为。我的建议:除非你在EventQueue上,否则永远不会认为关于Swing组件。)

(如果你看一下:1.4 EventQueue类是一段漂亮的代码.1.7似乎使用线程安全的非阻塞跳过列表而不是旧的wait / notify。我确信它很快,但是代码是一个怪物。如果你确实想要出于任何原因建立自己的队列,那么尝试将1.4代码作为起点.Java应该有一个通用的执行队列类,但我还没有找到它。)

你真的不应该在EventQueue性能方面遇到太多麻烦。应该每秒使用少于CPU秒。除非您将大量CPU密集型可运行的内容丢弃,否则您不必担心它。如果是,您可以考虑将工作放在另一个线程中。 (虽然偶尔减慢用户界面似乎是将一切保留在一个线程中的一小部分费用。)重新排序队列可能无论如何也无济于事。您想要快速处理的runnable必然会在一些重大计算开始后立即到达。

如果您只想按顺序运行自己的runnable,可以设置一个类来保存可运行的已排序列表。它会有自己的runnable,你可以使用InvokeLater放入EQ。当它运行时,它又可以按照你想要的顺序运行每个可运行的程序。但这只有在您需要根据自己的目的排序的runnable时才有用。

如果您只使用Swing组件,可见或其他方式,您可能会使用InvokeLater设计的EQ来完成所有工作。