淺談Swing線程三種
看到很多地方講述Swing中的并發(fā)和多線程問(wèn)題,感覺(jué)講的都不如Sun的教程,這里復(fù)述一下關(guān)鍵。Swing之所以和多線程緊密聯(lián)系在一起是因?yàn)閳D形界面編程中如果只采取順序編程(也就是你的代碼或任務(wù)依次執(zhí)行),會(huì)出現(xiàn)很大的問(wèn)題,比如你要編寫(xiě)一個(gè)FTP客戶端,你不能讓文件下載的時(shí)候,用戶界面死在那里,你既不能取消任務(wù)也不能和界面交互吧。所以有必要將耗時(shí)的任務(wù),比如文件下載放到一個(gè)獨(dú)立的線程中處理,而讓用戶同時(shí)能夠干其他事情。簡(jiǎn)單來(lái)說(shuō),Swing中有三種線程:
1. 啟動(dòng)Swing線程或者初始線程: 這個(gè)線程負(fù)責(zé)調(diào)用main方法,很多順序編程一開(kāi)始就用的是這種線程。在Swing中啟動(dòng)線程負(fù)責(zé)很少的事務(wù),主要干兩件事情,***件就是創(chuàng)建一個(gè)可運(yùn)行的對(duì)象(Runnable Object),這個(gè)可運(yùn)行對(duì)象的任務(wù)比較重要,它負(fù)責(zé)初始化圖形界面,第二件就是將這個(gè)可運(yùn)行對(duì)象安排到另外一個(gè)非常重要的線程,事件分派線程中執(zhí)行。第二件事情是通過(guò)SwingUtilies的invokeLater和invokeAndWait方法來(lái)實(shí)現(xiàn)的。幾乎所有的創(chuàng)建Swing組件和與Swing組件交互的代碼都要在事件分派線程中執(zhí)行。
2. 事件分派Swing線程:在Swing中負(fù)責(zé)事件處理的代碼需要在一個(gè)特定的線程中運(yùn)行,這個(gè)線程就是事件分派線程。大部分調(diào)用Swing方法的代碼也在這個(gè)線程中運(yùn)行。原因是大部分Swing對(duì)象中的方法并不是線程安全的,所以需要這個(gè)特定的事件分派線程來(lái)保證線程安全。當(dāng)然也有部分swing對(duì)象中的方法指明是線程安全的,這些方法可以在任何線程中調(diào)用。你可以將事件分派線程中運(yùn)行的代碼想象成一系列短小的任務(wù),大部分任務(wù)都是調(diào)用事件處理方法,例如ActionListener.actionPerformed()方法,其他任務(wù)可被程序代碼通過(guò)SwingUtilities 的invokeLater/invokeAndWait方法來(lái)安排。需要注意的是,在事件分派線程中的任務(wù)必須短小精悍,這意味著這些任務(wù)能夠很快執(zhí)行完畢,如果你發(fā)現(xiàn)有一個(gè)耗時(shí)的任務(wù),那么你肯定出錯(cuò)了,你會(huì)發(fā)現(xiàn)你的圖形界面經(jīng)常被卡住,或者死掉了。對(duì)于耗時(shí)任務(wù)你需要另外一個(gè)線程,例如工作線程 (Worker Thread)來(lái)處理。判斷你的代碼時(shí)候運(yùn)行在事件分派線程上的方法很簡(jiǎn)單,使用javax.swing.SwingUtilities.isEventDispatchThread()方法即可。
3. 工作Swing線程(Worker Thread)或者后臺(tái)線程(Background Thread):你可以在這個(gè)線程中處理耗時(shí)任務(wù)。
【編輯推薦】















 
 
 





 
 
 
 