查找EventQueue上有多少Runnable正在等待



是否有任何方法可以确定EventQueue中当前排队的Runnables数量?。。。我指的是系统EventQueue,即要在EDT中运行的所有Runnables。也许还会弄乱队伍?

我想做的是优先考虑GUI可运行程序。。。如果出现用户驱动的GUI事件,应该立即执行,在任何排队的Runnables之前跳过队列(顺便说一句,这些Runnables都将涉及修改不可见的Swing组件。注意最新的Swing指南:所有Swing组件都必须在EDT上更改,即使是隐藏的)。

有可能创建一个带有"紧急"one_answers"非紧急"Runnables的简单、人为的队列:每个Runnables可以增加一个"可观察"的AtomicInteger计数器,然后每个计数器的执行可以减少它……如果BlockingQueue的大小降到1(或者2或0),BlockingQueue将确保非紧急Runnables只会提交到"invokeLater"。本能让我觉得这样的安排会带来相当多的延迟。

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

NB显然,必须从非EDT线程中观察EDT队列的状态(或对其进行干预)。据我所知,可能存在"线程可见性"问题。。。

我认为这是不可能的。代码可用。您可以覆盖它,甚至重写它,但实际的EventQueue是由系统设置的;除非通过几个定义的方法,否则您无法访问它。您当然可以设置自己的并使用它,但所有Swing组件都将使用官方EQ,您最终将使用多线程Swing。(根据个人经验,这非常有效,除了偶尔出现的、令人恼火的、莫名其妙的奇怪行为。我的建议是:除非你在EventQueue上,否则永远不要思考Swing组件。)

(如果你仔细看一下:1.4 EventQueue类是一段漂亮的代码。1.7似乎使用线程安全、无阻塞的跳过列表,而不是旧的等待/通知。我相信它很快,但代码是一个怪物。如果你出于任何原因想要构建自己的队列,试着从1.4代码开始。Java应该有一个通用的执行队列类,但我还没有找到。)。)

您确实不应该在EventQueue性能方面遇到太多问题。它应该每秒使用不到一个CPU秒的时间。除非你将大量CPU密集型的可运行程序放入其中,否则你不必担心。如果你担心,你可能会考虑将工作放在另一个线程中。(尽管偶尔放慢UI的速度似乎是将所有内容都保留在一个线程中的一个小代价。)无论如何,重新排序队列可能不会有多大帮助。你想要快速处理的可运行程序必然会在一些大的计算开始后立即到达。

如果你只想按顺序运行自己的可运行程序,你可以设置一个类来保存可运行程序的排序列表。它将有自己的可运行程序,您可以使用InvokeLater将其放入EQ中。当它运行时,它可以按照您想要的顺序运行它的每个可运行程序。但只有当你需要为自己的目的对可运行文件进行分类时,这才有帮助。

如果您只使用Swing组件,无论是可见组件还是其他组件,那么使用InvokeLater设计的EQ可能会做得很好。

最新更新