[英]Is it safe to use OSGi EventAdmin within EDT?
在Swing环境中可以安全使用EventAdmin吗? 我问,因为我有以下顺序:
这样做的目的是让任何订阅者将需要的东西安装到一个JPanel上,一旦每个订阅者被调用,该面板就会显示出来。
第一次单击按钮时,一切正常,因为在EDT中执行了所有操作。 第二次,在不是EDT的线程中调用我的订户。 因此,我在invokeAndWait启动的可运行程序中执行JComponent安装。 该调用将阻塞5022ms(5000ms是默认的EventAdmin超时时间)。 解除阻止后,将显示我的对话框。 在以下情况下,不再呼叫我的订户。 它必须已被EventAdmin列入黑名单。
为什么第二次不在EDT中调用我的订户?
不可以。事件管理员不能保证事件将在哪个线程上传递,并且可以肯定不是原始发送线程。
由于您的处理程序不知道它在哪个线程上,因此它无法直接操作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
}
});
}
}
EventAdmin规范不需要在发布事件的同一线程上传递事件。 您将需要使用添加了此保证的EventAdmin实现,因为必须在发布事件的同一线程上接收该事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.