[英]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.