可以有多个AWT事件队列吗?

时间:2009-03-20 08:24:34

标签: java multithreading swing events queue

我在Opera 9.64 Build 10487中的JVM 1.6.0_12上运行了一个applet的线程转储 - 它显示了三个事件队列!据我所知,Java Swing事件处理是单线程的 - 在最近的任何更新中都做了这个改变吗?

我的问题是,多个事件队列往往会导致死锁,因为我有更多的锁而不仅仅是GUI TreeLock。

4 个答案:

答案 0 :(得分:8)

可以有多个,这取决于浏览器。 EventQueue documentation说:

有些浏览器将不同代码库中的applet分成不同的上下文,并在这些上下文之间建立隔离墙。在这种情况下,每个上下文将有一个EventQueue。其他浏览器将所有applet放在同一个上下文中,这意味着所有applet只有一个全局的EventQueue。此行为与实现有关。

答案 1 :(得分:4)

是。通常,Toolkit只有一个Toolkit.getDefaultToolkit,但EventQueue只有Toolkit.getSystemEventQueue个(从1.2.2开始,您通常会获得成功调用的权限)。基于堆栈上的ThreadGroupClassLoader的魔法来确定要返回的EventQueue

Applet根据其来源和配置进行分区。具体如何做是依赖于实现。

现在,您可能看到的是applet的事件队列和安全上下文。安全上下文处理插件本身的对话框。接受证书和类似的东西。安全上下文使这些内容远离applet上下文中的用户代码。

答案 2 :(得分:2)

此外,当您显示模式对话框时,Swing会创建一个新的EventQueue(和线程IIRC),此事件队列处于活动状态(前一个处于“保持”状态),直到模式对话框关闭。

但是,我不确定当有几个级别的模态对话框时会发生什么(每个对话框有1个主队列+ 1个队列,或者所有对话框都有1个主队列+ 1个队列)。

答案 3 :(得分:2)

“当您显示模态对话框时,Swing会创建一个新的EventQueue(和线程IIRC)”实际上它是错误的。我前段时间与Swing讨论了这个问题,而Swing只在现有事件队列上添加了新的过滤器来过滤掉来自不同源(窗口/组件)的事件。因此没有为模态对话框创建新的线程/ EQ。您可以通过打开模式对话框并在打开模式对话框之前和之后获取线程转储来验证这一点,并比较AWT线程调用堆栈。至少它与标准Java应用程序的关系如何。我还没有查看applet案例。