7

我有一个在 Opera 9.64 Build 10487 的 JVM 1.6.0_12 上运行的小程序的线程转储 - 它显示了三个事件队列!据我所知,Java Swing 事件处理是单线程的——这在最近的更新中是否发生了变化?

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

4

4 回答 4

8

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

一些浏览器将不同代码库中的小程序划分为单独的上下文,并在这些上下文之间建立墙。在这种情况下,每个上下文将有一个 EventQueue。其他浏览器将所有小程序置于同一上下文中,这意味着所有小程序只有一个全局事件队列。此行为取决于实现。

于 2009-03-20T08:33:29.353 回答
4

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

Applet 根据其来源和配置进行分区。究竟如何做到这一点取决于实现。

现在,您可能看到的是您的小程序和安全上下文的事件队列。安全上下文处理来自插件本身的对话框。接受证书之类的。安全上下文使这些远离您的小程序上下文中的用户代码。

于 2009-03-20T13:42:53.667 回答
2

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

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

于 2009-03-25T06:21:28.553 回答
2

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

于 2010-05-07T15:46:05.983 回答