FRC筆記 - Event Dispatching Thread (二)
Swing中執行緒是基於單一規則:
- EDT負責去執行任何修改元件狀態的方法。
也就是說我們在建立Swing時,應該在EDT上建立而不是在其它地方。
不個上面這點,是很多人容易犯錯的地方,如下:直接在主程式中建造GUI,就是違反了此規則( 沒有把建造GUI的工作放在EDT上 )。雖然這樣的做法,在一些小程式中不見得會出包,但最好還是養成習慣,讓GUI的建造工作放在EDT上(現在大部分的IDE都可以幫我們做好這些事)
很多人都知道Swing不是」Thread-Safe」的 - 除了少數幾個。所以,我們必須要將Swing上修改元件狀態的事情,放在EDT上去執行,其背後的含意就是讓Swing可以去保證這些事件的可預測性。
回頭看看先前費時操作的例子
說到費時操作的避免,很多人應該會直覺的想到 - 使用另外的Thread來處理...雖然上面這類的作法是可行。但是! 這樣的作法是違反了文章一開始提到的原則。也就是元件狀態的改變不是發在EDT上面,而是由交由其它執行緒來完成 。
雖然這樣可能不會有問題,但這是錯誤的,如果這邊出現問題,就會很難去發現 。
Swing提供了這2個方法來解決上面所提到的問題。
- InvokeLater
- InvokerAndWait
這二個方法都存在於javax.swing.SwingUtilities類別中。InvokeLater會將一個含有Runnable的特定事件,放到EDT上,並等待執行,就和其它在EDT上的事件一樣。
當發佈到EDT上後,程式會回來繼續做接下來的事。直到這個事件被執行,才會對某個元件的狀態做改變。而不會像先前一樣,要先等前面的事做完,元件(整個swing)才可以改變其狀態,也就不會有類似deallock的情況產生。
下面是修改後的程式InvokeAndWait比較少被拿來使用,它與InvokeLater有點類似,一樣是將一個Runnable任務放到EDT上執行。
不同的是它不會馬上回來繼續做接下來的事情,而是等這個任務被執行到了才回來做其它事。
所以,如果使用的不恰當,就容易有deallock的情況產生。
很高兴造访我的Blog。我对swing的造化只是比一般人多研究了那么一点,最初对swing产生兴趣来源于Java比MFC简单,而且MFC、VB拖拽出来的的UI代码是隐蔽的,而java就不同,可以清晰看到代码,这是我喜欢JavaUI的初衷。
swing作为桌面技术的一种,和其他UI技术有很多共同的技巧,彼此是互通的。
同时由于接触swing会比web开发人员更有机会参与Socket、Thread的相关开发从而带动了网络协议、并发编程的经验,这才是最重要的。
以后我可能要转向手机开发了,但是有JavaSE和Swing的开发经验,相信转型很容易
由...發表 电玩 on 十月 09, 2009 at 11:56 下午 CST #
祝您順利:)
由...發表 UndeadJ on 十月 10, 2009 at 09:37 下午 CST #