日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
概述Swing組件與外部線程

Swing組件與外部線程介紹,先總結(jié)下最常見的一個(gè)說法;Swing是單線程的。

創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、成都做網(wǎng)站與策劃設(shè)計(jì),博羅網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:博羅等地區(qū)。博羅做網(wǎng)站價(jià)格咨詢:18982081108

我的理解就是,一旦Swing組件被實(shí)現(xiàn)(setVisiable(true)/show()/pack()或者父組件已經(jīng)被實(shí)現(xiàn)),所有改變組件狀態(tài)的代碼或者依賴于組件狀態(tài)的程序代碼,全部需要給EDT執(zhí)行。在這之前可以由多少個(gè)線程調(diào)都無所謂。所有的Swing組件都認(rèn)為只有EDT才會(huì)調(diào)用它們,為此組件的方法都是不做同步處理的。為什么這么做呢。在我的另一篇blog 中有提到worker thread模式,當(dāng)只有一個(gè)worker thread時(shí)候,可省略掉共享互斥的開銷,極大的提高性能,這就是Event-dispatching thread的實(shí)質(zhì)。它的具體作用大概歸納下。

1.會(huì)調(diào)用處理事件的listener
比如單擊一個(gè)button的時(shí)候,ActionEvent實(shí)例被放入到EventQueue中。EDT從EventQueue中獲取到這個(gè)事件,就會(huì)調(diào)用用來處理這個(gè)事件的listener中的actionPerformed方法。而這時(shí)候EDT是不知道 actionPerformed到底會(huì)做什么事情的,它僅僅是單純的去執(zhí)行它而已。追溯上去,可以明白給一個(gè)Component注冊的Listener, 其實(shí)就是對Component設(shè)置當(dāng)某個(gè)事件發(fā)生的時(shí)候,EDT所調(diào)用的方法所在的實(shí)例。

2.重繪畫面paint或者update
當(dāng)我們想重繪畫面的時(shí)候,會(huì)去調(diào)用repaint.其實(shí)調(diào)用repaint并不是馬上去畫,而是記錄下要繪制的區(qū)域,具體的繪制還是由EDT操刀完成。revalidate也是類似。因此在組件被實(shí)現(xiàn)后,repaint,revalidate還有一大堆的 addXXXListener,removeXXXListener等都可被其他線程效用。

再總結(jié)下兩個(gè)非常重要的方法invokeAndWait和invokeLater,它們傳入?yún)?shù)都是Runnable對象。
invokeAndWait會(huì)等待Runnable執(zhí)行完畢才返回。也就是,外部線程調(diào)用這個(gè)方法后,就會(huì)處于阻塞狀態(tài),如果EventQueue還有其他的事件,需要它們?nèi)勘粓?zhí)行完成,這時(shí)候輪到EDT來執(zhí)行Runnable對象,等它也執(zhí)行完了,調(diào)用invokeAndWait的外部線程才會(huì)繼續(xù)活動(dòng)。

invokeLater就耿直多了,直接把Runnable塞到EventQueue中就完事了,至于什么時(shí)候執(zhí)行,看EDT有空沒有咯。


網(wǎng)站標(biāo)題:概述Swing組件與外部線程
文章URL:http://www.5511xx.com/article/dpohppe.html