2011-04-08 22 views
3

對於我當前的應用程序,我正在努力識別我的應用程序中的Swing線程。與Swing線程我的意思是:識別用於顯示Java中頻繁數據輸入的Swing線程

  • 初始線程
  • 事件調度線程
  • 工作線程

我的應用程序:

這是爲了顯示數據
  • 簡單的用戶界面在插座上收到
  • 數據被描述爲b ÿ許多模型類
  • 所接收的數據是被解析XML,模型對象被實例化
  • 用戶界面應該顯示所接收的數據
  • 這些數據被非常頻繁地更新,這意味着XML消息是簡短,但其中有很多
  • 把它放到上下文中:我正在編寫一個Java分析器。

我已經閱讀了Swing教程到目前爲止,所以這裏是我的猜測和疑問:

後臺任務是服務器插槽,分別後臺任務是對其中應用接收打開的連接數數據。

  1. 任務沒有最終的結果,所以我想應該SwingWorker<T,S>只定義泛型類型爲中期業績?對於每個解析的XML,我都會致電publish。但是,如何區分我收到的數據?也許XML數據只包含足夠的信息來構建class A或者數據包含足夠的信息來構建class Aclass B,但是如何將兩者都包裝到一個臨時結果中?一個包裝類?

  2. process()方法調用更改以使其對用戶界面可見,不是嗎?我不明白這是如何工作的。我在哪裏啓動我的任務?它是爲了調用JFrame構造函數中的SwingWorker.execute()

  3. XML閱讀器應該是任務還是每個處理傳入連接的線程都是任務?

回答

2

在您描述的上下文中,我不確定我會使用SwingWorker

我的基本想法是:

  • main(),爲服務插槽(標準Thread API)
  • 當一個這樣的插座線程得到一些輸入,它解析XML馬上啓動多個線程(正如你所描述的那樣,解析應該是非常快的,因此我認爲你不需要爲此只開始一個新線程)
  • 一旦XML被解析,套接字線程創建一些「結果對象」被顯示,在a中聲明這個對象final變量,並調用SwingUtilities.invokeLater()在UI中顯示這個結果

,我已經在過去成功地使用另一種方法是使用一個EventBus會照顧callingthe UI更新方法在EDT,您的套接字線程會將「結果對象」發送到該EventBus。

關於SwingWorker使用,我會說主要用途是當最終用戶開始一個動作(例如通過點擊一個按鈕或一個菜單項)並且這個動作很長並且應該在後臺處理時,後臺處理方法會然後必須將信息反饋給用戶界面。

+0

非常好,這看起來像我正在尋找的解決方案。不過,我看到invokeLater和使用EventBus沒有區別。 – 2011-04-08 11:02:54

+0

使用EventBus避免了必須聲明並傳遞內聯Runnable,唯一的功能是調用UI上的更新方法。在我看來,設計更清潔一些。 – jfpoilpret 2011-04-08 11:40:01

+0

是由Java Swing提供的EventBus接口嗎?我找不到任何文檔,或者它是可以用於我的事業的架構嗎? – 2011-04-08 12:36:54