gpt4 book ai didi

java - 在 EDT 中使用 OSGi EventAdmin 是否安全?

转载 作者:行者123 更新时间:2023-11-29 07:58:23 25 4
gpt4 key购买 nike

在 Swing 环境中使用 EventAdmin 是否安全?我问是因为我有以下顺序:

  • 从 JButton 接收 ActionListener 通知
  • 创建一个 JPanel 并将其放入我的事件的属性中
  • 使用 EventAdmin#sendEvent(Event) 同步发送我的事件
  • 在我的订阅者中接收事件
  • 从属性中检索 JPanel,如果不在 EDT 中,则使用 SwingUtilities#InvokeAndWait,将一些 JComponent 放入其中
  • 在 EventAdmin#sendEvent() 的调用者中,方法返回,JPanel 已填充,然后我可以将它添加到我的对话框并显示它。

这样做的目的是让任何订阅者将其需要的内容安装到 JPanel 中,一旦调用每个订阅者,该 JPanel 就会显示。

我第一次点击我的按钮时,一切正常,因为一切都在 EDT 中执行。第二次,我的订阅者在一个不是 EDT 的线程中被调用。因此,我在 invokeAndWait 启动的可运行程序中执行 JComponent 安装。此调用阻塞 5022 毫秒(5000 毫秒是默认的 EventAdmin 超时持续时间)。解锁后,将显示我的对话框。以下几次,我的用户不再被调用。它一定已被 EventAdmin 列入黑名单。

为什么我的订阅者没有第二次从 EDT 中调用?

最佳答案

没有。 Event Admin 不保证事件将在哪个线程上传递,并且几乎可以肯定不是原始发送线程。

由于您的处理程序不知道它在哪个线程上,因此它不能直接操作 GUI。相反,它必须使用 SwingUtilities.invokeLater() 将 Runnable 推送到事件队列,并且在该 Runnable 中您可以更改 GUI。例如:

class MyEventHandler implements EventHandler {
public void handleEvent(final Event event) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// here you can make the UI changes in response to the event data
}
});
}
}

关于java - 在 EDT 中使用 OSGi EventAdmin 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com