




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Tektronix (China) Co., LTD NO.1Java Swing & AWT高高級級事件機制事件機制Haojun RenTektronix2011.09Tektronix (China) Co., LTD NO.2引子:一個故事這是一個封閉的且非常注重安全的城市外界溝通的渠道只有一個單向環(huán)形高速公路任何物資運輸必須通過卡車單向運輸 到另一個點這個城市從外界(森林和河流)獲取 木材和水等通過自來水廠和木材廠加工成自來水 和家具并將這些產(chǎn)品運輸給居民或?qū)W校使用某一種特供物資必須由一種高性能, 速度極快的卡車運輸,且一刻都不能 耽誤Tektronix (China) Co.
2、, LTD NO.3引子:一個故事開始一切都很正常,直到有一天有個質(zhì)量不好的卡車出發(fā)了,半路嚴重拋錨,司機下來修車。但是這車太難修,一修就是幾天, 結(jié)果后面的汽車無法前進,各種物資無法按時運到目的地 ,最嚴重的是,有若干輛運送特供物資的卡車也被堵著市民急了,市長急了,但沒有任何解決辦法,于是城市暫時癱瘓了經(jīng)過這次教訓(xùn),市政府決議,“由于堵車情況無法避免,但運送特供物資的卡車是無論如何不能耽誤”,于是給出三個解決方案Tektronix (China) Co., LTD NO.4引子:一個故事 解決方案:開辟一條新的運輸線路,來行駛質(zhì)量不好的卡車,其他好卡車不小心駛到這條運輸線路的時候,交警會指揮
3、把它們強制駛回單向環(huán)形高速公路質(zhì)量不好的卡車一旦拋錨,交警會指揮首先讓其他好卡車先通過,在其他好卡車通過之前,它不能做修理這個問題很棘手,交給專業(yè)公司外包解決Tektronix (China) Co., LTD NO.5Java 進程與線程Java進程(Process)一種于自身定址空間中執(zhí)行的獨立程序。所謂多工(Multitasking)操作系統(tǒng),會周期性的將CPU時間劃分給每個進程,使操作系統(tǒng)得以同時執(zhí)行一個以上的進程,并讓每一個進程都像獨立運作一樣Java線程(Thread)Java線程(Thread)是進程(Process)中的一個“單一連續(xù)控制流程”(A single sequenc
4、tial flow of control)。一個進程(Process)可擁有多個并行(Concurrently)的線程Tektronix (China) Co., LTD NO.6Java 進程當Swing界面程序啟動后,虛擬機(JVM)會啟動3個線程主線程Swing事件派發(fā)線程EDT(Event-dispatching thread)系統(tǒng)工具包線程Tektronix (China) Co., LTD NO.7主線程通常意義下的Java線程,該線程從Java進程啟動到終止,貫穿始終例如:一個Java應(yīng)用程序(進程)啟動,通過main方法,主線程創(chuàng)建并啟動;通過System.exit方法,主線程
5、銷毀,進程結(jié)束Tektronix (China) Co., LTD NO.8GUI系統(tǒng)的事件模型事件派發(fā)線程(Event-dispatching thread)和事件處理線程單線程模型 - 事件的派發(fā)線程和處理線程是同一線程 - 事件從事件隊列中取出之后,立即在當前線程中處理,處理完后才取下一個事件繼續(xù)循環(huán)。在同一線程中完成事件派發(fā)和組件的模型數(shù)據(jù)處理(更新界面)多線程模型 - 事件的派發(fā)線程和處理線程是分別不同一線程 - 事件派發(fā)線程負責從事件隊列中獲取事件 - 事情處理線程負責組件的模型數(shù)據(jù)的處理 - 當獲取到新的事件后,它會啟動新的事件處理線程,并將事件交由此線程處理,之后派發(fā)線程并不等
6、待事件處理線程完成,而是立即獲取下個事件進行派發(fā)Tektronix (China) Co., LTD NO.9GUI系統(tǒng)的事件模型Tektronix (China) Co., LTD NO.10GUI系統(tǒng)的事件模型 多線程模型存在多個處理線程同時處理,可能產(chǎn)生同步問題 - 程序數(shù)據(jù)的同步出現(xiàn)問題 - 組件的數(shù)據(jù)模型產(chǎn)生同步問題GUI系統(tǒng)來說必須考慮組件的外觀同其數(shù)據(jù)模型一致需要采用復(fù)雜的同步機制來保持數(shù)據(jù)模型的同步,對于系統(tǒng)的開發(fā)者和應(yīng)用開發(fā)者來說都是很高的要求該模型很少被現(xiàn)有的GUI系統(tǒng)采用Tektronix (China) Co., LTD NO.11GUI系統(tǒng)的事件模型 單線程模型事件處
7、理線性且處理順序固定,避免同步問題缺陷是線程獨占為了避免長時間事件處理占據(jù)線程,應(yīng)用程序往往在事件處理方法中啟動其他線程來完成事件的處理,而將事件派發(fā)線程留給耗時短的事件處理為了保證界面的一致性,使用單線程模型GUI系統(tǒng)的應(yīng)用需要將對組件的操作放在事件派發(fā)線程上完成,畢竟組件的操作(主要是刷新)是耗時短暫的Tektronix (China) Co., LTD NO.12GUI系統(tǒng)的事件模型 Awt和Swing單線程模型Awt和Swing組件操作是非線程安全的,因為幾乎所有的組件操作方法都未做同步處理,所以不建議采用多線程。(怎么實現(xiàn)對組件操作方法的同步處理?)Awt組件操作是線程安全的,因為它
8、內(nèi)部采用許多復(fù)雜的同步機制來完成這個操作Swing和Swt的不同是Swt在運行時檢查組件操作是否在派發(fā)線程上,如果不是則拋出異常警告,而Swing則需要程序員自己做控制 SwingUtilities.isEventDispatchThread(),判斷當前線程是否是Awt事件派發(fā)線程Tektronix (China) Co., LTD NO.13GUI系統(tǒng)的事件模型 Awt和Swing單線程模型這是一個封閉的且非常注重安全(線程安全)的城市(用戶界面)外界溝通的渠道只有一個單向環(huán)形高速公路(事件隊列循環(huán))任何物資運輸必須通過車輛 (各種事件)單向運輸?shù)搅硪粋€點這個城市從外界(森林和河流)獲取
9、木材和水等(鼠標、鍵盤等原生事件)通過自來水廠和木材廠 (各種組件) 加工成自來水和家具(邏輯事件)并將這些產(chǎn)品運輸給居民或?qū)W校 (消費邏輯事件的事件處理器) 使用某一種特供物資( 響應(yīng)界面繪制)必 須由一種高性能, 速度極快的卡車 (repaint)運輸,且一刻都不能耽誤Tektronix (China) Co., LTD NO.14GUI系統(tǒng)的事件模型 Awt和Swing單線程模型開始一切都很正常,直到有一天有個質(zhì)量不好的卡車(耗時性長事務(wù))出發(fā)了,半路嚴重拋錨,司機下來修車。但是這車太難修,一修就是幾天(長耗時,且線程獨占), 結(jié)果后面的汽車(事件)無法前進,各種物資無法按時運到目的地(
10、堵塞) ,最嚴重的是,有若干輛運送特供物資的paint(響應(yīng)界面繪制)的卡車也被堵著市民急了,市長急了,但沒有任何解決辦法,于是城市暫時(用戶界面)癱瘓(失去響應(yīng),灰框Gray Rectangle)了經(jīng)過這次教訓(xùn),市政府(事件派發(fā)線程)決議,“由于堵車情況無法避免,但運送特供物資的paint(響應(yīng)界面繪制)卡車是無論如何不能耽誤”,于是給出三個解決方案,哪三個?Tektronix (China) Co., LTD NO.15GUI系統(tǒng)的事件模型 Awt和Swing單線程模型 解決方案:開辟一條新的運輸線路(非EDT線程),來行駛質(zhì)量不好的卡車(耗時性長事務(wù)),其他好卡車(特別是paint 的卡
11、車)不小心駛到這條運輸線路的時候,交警會指揮把它們強制駛回單向環(huán)形高速公路(事件隊列循環(huán))- InvokeLater質(zhì)量不好的卡車(耗時性長事務(wù))一旦拋錨,交警會指揮首先讓其他好卡車先通過,在其他好卡車通過之前,它不能做修理(被EDT線程堵塞,等待返回)- InvokeAndWait這個問題很棘手,交給專業(yè)公司外包解決(SwingWorker)Tektronix (China) Co., LTD NO.16Swing事件派發(fā)線程EDT(Event-dispatching thread)負責把事件隊列里的事件派發(fā)到相應(yīng)組件上,并調(diào)用繪制方法更新界面事件(Event)事件隊列(EventQueue
12、)事件派發(fā)線程EDTTektronix (China) Co., LTD NO.17事件(Event)發(fā)送給Java GUI系統(tǒng)的消息,該消息通知Java GUI系統(tǒng)某種事情已經(jīng)發(fā)生,要求作出響應(yīng)。事件具有組播性。根據(jù)事件來源,可歸類為三種:計算機輸入輸出設(shè)備產(chǎn)生的中斷事件GUI系統(tǒng)觸發(fā)的邏輯事件應(yīng)用程序觸發(fā)的事件Tektronix (China) Co., LTD NO.18事件(Event)計算機輸入輸出設(shè)備產(chǎn)生的中斷事件最原生的底層事件需要組件做深入處理,籍此觸發(fā)更高抽象層次具有語義的邏輯事件GUI系統(tǒng)擴展自定義組件往往需要編寫處理這些事件,派發(fā)高級邏輯事件這些事件對應(yīng)的有MouseEv
13、ent、KeyEvent 、 FocusEvent等,實現(xiàn)鼠標,鍵盤,焦點同GUI系統(tǒng)的交互操作由系統(tǒng)工具包線程負責捕獲 AWT-Windows線程 AWT-Solaris AWT-LinuxTektronix (China) Co., LTD NO.19事件(Event)GUI系統(tǒng)觸發(fā)的高級邏輯事件計算機輸入輸出設(shè)備產(chǎn)生的中斷事件經(jīng)過組件的處理后發(fā)出的高級邏輯事件 Swing的JButton產(chǎn)生的ActionEvent界面處理的高級邏輯事件 重繪(repaint-Component) 重布局(validate-Container,revalidate-JComponent) 更新UI(upd
14、ateUI-Swing組件實現(xiàn)類) 接收到EXPOSE事件或GUI系統(tǒng)顯式調(diào)用上述方法后觸發(fā)的事件 (當被遮擋的窗口被暴露時,AWT-Windows線程獲得到了這個EXPOSE事件) Tektronix (China) Co., LTD NO.20事件(Event)應(yīng)用程序觸發(fā)的事件有兩種觸發(fā)方式:事件通過方法調(diào)用被添加到系統(tǒng)事件隊列進行派發(fā) - 通過postEvent、repaint及invokeLater等方法,向系統(tǒng)事件隊列添加事件 - 調(diào)度機制。事件被添加到系統(tǒng)事件隊列后觸發(fā)過程結(jié)束,事件的處理要在事件派發(fā)線程EDT上等待執(zhí)行 - 觸發(fā)事件的線程和事件派發(fā)線程可以不是同一個線程通過調(diào)用
15、組件的派發(fā)方法進行觸發(fā) - 通過fireEventXXXX(例如fireActionPerformed,fireTableDataChanged)觸發(fā) - 函數(shù)調(diào)用機制。事件對象不會被放到系統(tǒng)事件隊列中去,而是直接傳遞給事件處理方法處理 - 這種事件觸發(fā)方式要求事件處理線程必須同時是事件派發(fā)線程Tektronix (China) Co., LTD NO.21事件隊列(EventQueue)事件隊列是線性的,同步的 一個事件需要等待在它之前的事件先處理完畢后,才被處理壓棧出棧模式 排隊:依次排隊,末端進入,頂端彈出 處理:先進先處理,后進后處理Swing的事件隊列做了很多優(yōu)化Tektronix
16、(China) Co., LTD NO.22事件派發(fā)線程EDT單線程模式職責分明,任何GUI請求都應(yīng)該在EDT線程中被調(diào)用非常忙碌,需要處理的GUI請求非常多,包括窗口移動、組件自動重繪、刷新,所以耗時極短的請求可在EDT線程中被調(diào)動,任何與GUI無關(guān)的處理不要由EDT線程來負責一旦Swing組件被實現(xiàn)或者顯示,所有改變組件狀態(tài)的代碼或者依賴于組件狀態(tài)的程序代碼,全部需要給EDT執(zhí)行 - setVisiable(true) 顯示 - show() 顯示 - pack() 實現(xiàn) - 父組件已經(jīng)被實現(xiàn)或者顯示 上述4種方法(或之一)出現(xiàn)以前,所有的關(guān)于界面的代碼一般是安全的,但還是強烈建議當在ED
17、T線程里面執(zhí)行; 上述4種方法(或之一)出現(xiàn)以后,所有的關(guān)于界面的代碼都必須在EDT線程里面執(zhí)行;(見InvokeLater篇)Tektronix (China) Co., LTD NO.23事件派發(fā)線程EDT界面處理的高級邏輯事件,可以被非EDT線程所調(diào)用,一旦被調(diào)用,上述方法并不是立刻并執(zhí)行,而是被掛到事件隊列里,由EDT線程去執(zhí)行 - 重繪(repaint-Component) - 重布局(validate-Container,revalidate-JComponent) - 更新UI(updateUI-Swing組件實現(xiàn)類)負責將事件隊列中的事件進行預(yù)處理,比如多個連續(xù)的Paint事件
18、合并成一個Tektronix (China) Co., LTD NO.24事件派發(fā)線程EDT理解JDK源碼- JComponent中的revalidate方法可見,revalidate在EDT和非EDT線程中都可被調(diào)用Tektronix (China) Co., LTD NO.25特殊事件同步的繪制請求paintImmediately方法,立即繪制當前界面如果根據(jù)事件隊列先進先出原則,在EDT線程中調(diào)用paintImmediately,是不是被掛到隊列最后?paintImmediately是不是意味著它被插到事件隊列的最前面,裝模作樣排個隊,在被第一時間處理?實際上是插隊,連排隊都不要。它比任
19、何其他事件的優(yōu)先級最高,包括當前正在處理的事件。 EDT當收到paintImmediately的時候,必須放下手中正在處理的活(不管這個活干了多少),當paintImmediately處理完畢,繼續(xù)干它先前的活。這是Swing事件隊列機制的優(yōu)化表現(xiàn)Tektronix (China) Co., LTD NO.26系統(tǒng)工具包線程負責捕獲操作系統(tǒng)底層事件轉(zhuǎn)換和翻譯成Swing所認識的事(MouseEvent、KeyEvent 、 FocusEvent)放入到Swing的系統(tǒng)事件隊列(EventQueue)EDT線程中排隊等候這些事件,一旦被觸發(fā),將會被分派到Swing組件中事件處理和響應(yīng)。Tektr
20、onix (China) Co., LTD NO.27一個Swing事件模型的示例Pump an Event-Dispatch & Process Event-MouseListener.mousePressed-fireActionPerformed-ActionListener.actionPeformed-Do database query and display result to a table-Return from actionPerformed-Return from fireActionPerformed-Return from MouseListener.mouse
21、Pressed-Pump another EventTektronix (China) Co., LTD NO.28InvokeLater & InvokeAndWait非EDT線程的對組件的并發(fā)調(diào)用需通過 - invokeLater(runnable) - invokeAndWait(runnable) 使請求插入到隊列中等待EDT線程去執(zhí)行Tektronix (China) Co., LTD NO.29InvokeLater異步方式,立即返回This will happen after all pending AWT events have been processed具體何時執(zhí)行請求并不確定,視EDT線程是否空閑SwingUtilies.invokeLater = EventQueue.invokeLater - 保證代碼在EDT線程中運行 - 可能存在pack或者s
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陶瓷插芯市場分析及競爭策略分析報告
- 珠光材料市場分析及競爭策略分析報告
- 農(nóng)村安置房合同范本
- 農(nóng)村山地合同范例
- 2004用工合同范本
- 植物保護模擬試題含參考答案
- 維修電工模擬練習(xí)題含答案
- 企業(yè)光纖租賃合同范本
- ppp項目股權(quán)合同范例
- 不予退款合同范本
- DL∕T 2447-2021 水電站防水淹廠房安全檢查技術(shù)規(guī)程
- NB-T+10499-2021水電站橋式起重機選型設(shè)計規(guī)范
- 城市更新可行性研究結(jié)論與建議
- JT∕T 795-2023 事故汽車修復(fù)技術(shù)規(guī)范
- 2024年安徽中醫(yī)藥高等??茖W(xué)校單招職業(yè)適應(yīng)性測試題庫附答案
- 天津在津居住情況承諾書
- 2022年中考數(shù)學(xué)二輪專題復(fù)習(xí):二次函數(shù)性質(zhì)綜合題
- 最大攝氧量的測定
- 國網(wǎng)充電站運維安全管理
- 青海2024年01月青海省省直機關(guān)遴選公務(wù)員69人^2024年國家公務(wù)員考試考試大綱歷年真題筆試歷年高頻考點難、易錯點薈萃附答案帶詳解
- 無產(chǎn)權(quán)房屋買賣合同模板
評論
0/150
提交評論