2013-03-08 46 views
1

我有一個很大的疑問,在其設計模式採取以獲取以下信息:設計模式:多擺動接口監聽線程變量

我也不能是靜態的A類具有正在運行的線程,其更新一變量a1;

多揮杆類(B,C,D)必須用變量A.a1的當前值更新JLabel b1,c1,d1。因爲A不能是靜態的B,所以C,D不能做類似b1.setText(A.getInstance()。getA1())的東西;

每次創建A的新實例都沒有意義,因爲A具有特定的作用,並且無法每次創建。

因爲A有一個更新a1變量的線程,所以還有一個同步問題,我想A,B,C,D之間共享這個變量用於讀寫。

我想到了Observer模式,但它仍然要求每個B,C,D向A註冊,並且它不能解決同步問題。

回答

1

如果你想解除A,B,C和D的存在,那麼你需要創建一個Proxy對象,它將充當中間人。該對象將知道如何到達A的實例,並在不可用時進行臨時響應。

爲了使同步不成問題,我建議使用消息隊列來保存a1值的連續更改。代理將輪詢該隊列並相應地更新揮杆類。實際上,代理可以爲此實現Observer模式。在A上工作的線程必須將更新發布到消息隊列中。通過將其轉變爲一對一生產者消費者設置,您可以通過使用適當的排隊(如ConcurrentLinkedQueue)來最小化延遲。

Proxy甚至不必爲隊列中每個值的swing組件上的更新運行更新,而只是在最新(拋棄所有中間組件)。

更新:SwingWorker類似乎是一個很好的候選人。

+1

+1''SwingWorker''可能適用於這種情況,因爲'process()'在EDT上運行並且在'publish()'順序中看到'List '。 – trashgod 2013-03-08 15:52:16