簡體   English   中英

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

[英]Is it safe to use OSGi EventAdmin within EDT?

在Swing環境中可以安全使用EventAdmin嗎? 我問,因為我有以下順序:

  • 接收來自JButton的ActionListener通知
  • 創建一個JPanel並將其放在我的事件的屬性中
  • 使用EventAdmin#sendEvent(Event)同步發送我的事件
  • 在我的訂閱者中接收活動
  • 從屬性中檢索JPanel,如果不在EDT中,請使用SwingUtilities#InvokeAndWait,在其中放入一些JComponent。
  • 在EventAdmin#sendEvent()的調用方中,該方法返回,JPanel已填充,然后可以將其添加到對話框中並顯示它。

這樣做的目的是讓任何訂閱者將需要的東西安裝到一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM