2010-02-24 80 views
1

編輯 GUI應用程序:爲了使事情clearer-的Java:一個後臺線程

我有一個連接到遠程服務器,並更新了GUI的應用程序。該應用程序使用MVC模式。

1)遠程服務器可以發送更新我的應用程序的數據模型的消息。

2)GUI控制器類實現的PropertyChangeListener接口,並監聽在模型的更新,並更新GUI視圖類

3)應用程序能夠將消息發送回遠程服務器的用戶以下在GUI上採取行動。這使用從遠程服務器接收數據的相同對象。

我目前初始化「遠程服務器通信」對象和在我的主要方法的GUI類。由於通信對象可以獨立更新模型,我應該使用SwingUtilities.invokeLater()初始化這個對象嗎?

回答

2

我不能完全肯定我得到你,但我只是有一件事anyway--

拋出確保您觸摸界面的任何時間,它的AWT線程。在理論上,這意味着即使創建GUI(雖然在實踐中,很少有創造給你的主或者一些其他線程的線程的GUI問題,但Sun並在一個點上檢測到問題,並提出反對)

無論如何,這意味着您可以在任何時候想要從其他線程更新GUI時使用invokeLater。期。

(注意,只要GUI通過回調(ActionListener的,等等),這將永遠是AWT線程,所以你可以做你想要使用回調函數內的GUI什麼叫你。

隨着修改後的消息,我可能會提示,如果你有線程爭用的可能性並且正在做GUI I/O,處理它的一種方法就是在invokeLater中完成所有「有爭議」的事情。

儘管在您的主線程中實例化一個圖形用戶界面(在理論上所有的setVisible(true)都是合法的),如果有來自另一個線程的衝突的可能性,invokeLater會處理所有這些以非常確定的方式。

+0

比爾 - 謝謝。我已經簡化了我的原始問題,使其更加清晰。 – Luhar 2010-02-24 18:51:22

1

我的問題是這樣的:給供應商代碼初始化其自己的連接線,我還是把我所有的遠程通信代碼(解析事件,更新模型,將消息發送回遠程應用程序)在顯,將線程分開到初始化GUI的代碼?

如果我理解正確的話,這是發生了什麼。

的供應商庫將開始自己的線程,並最終將回調您的代碼給定的方法。

這將更新您的應用程序。一個線程已經在第三方庫中使用,這就足夠了。

如果你反過來應用與供應商的遠程服務器進行通信,您將需要使用自己的線程。那麼答案是肯定的。

如果你只是「反應」到什麼的供應商庫發送給您,則不需要一個單獨的線程。

+0

奧斯卡,謝謝你的回覆。是的,該應用程序還與遠程服務器進行通信。我將不得不考慮重新設計。 – Luhar 2010-02-24 18:33:01

1

SwingUtilities.invokeLater()將直接在GUI的Event Dispatch線程上運行Runnable。

換句話說,從來沒有用它來運行後臺任務,因爲它會停止GUI響應。子集SwingWorker改爲,如Sun's tutorial或其他背景Thread所示。