国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Swing可視化組件多線程操作機(jī)制研究

2012-12-31 00:00:00胡家芬
電腦知識(shí)與技術(shù) 2012年31期

摘要:介紹了Swing可視化組件,探討了使用Swing組件開發(fā)界面時(shí)的線程問題,從原理上闡述Swing的線程機(jī)制,分析Swing的事件派發(fā)線程的處理過(guò)程,對(duì)Swing對(duì)耗時(shí)任務(wù)的多線程處理方法進(jìn)行研究,結(jié)合實(shí)例給出解決策略,并說(shuō)明了基于SwingWorker的操作。

關(guān)鍵詞:Swing;多線程;事件隊(duì)列;SwingWorker

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2012)31-7481-02

Swing 是為Java設(shè)計(jì)的可視化工具包,是JAVA基礎(chǔ)類的一部分。它包括了多種圖形用戶界面器件,Swing是輕量級(jí)元件,用純Java寫成,因而可以跨平臺(tái)運(yùn)行。開發(fā)者可以方便地利用Swing豐富、靈活的功能和模塊化組件來(lái)創(chuàng)建優(yōu)雅的用戶界面。

Java是一個(gè)高度多線程環(huán)境。Swing在處理界面組件時(shí),被設(shè)計(jì)成單線程操作,以避免線程安全問題。而圖形化界面如果只采用順序編程,可能會(huì)出現(xiàn)等待長(zhǎng)時(shí)間任務(wù)執(zhí)行而造成響應(yīng)問題,這是不可接受的。因此,合理的多線程操作對(duì)于Swing至關(guān)重要,正確理解和使用Swing線程模型編程,是編寫響應(yīng)靈活的Swing程序的關(guān)鍵。

1 Swing線程設(shè)計(jì)

1.1 Swing的線程操作

Swing操作界面時(shí),需要調(diào)用與操作系統(tǒng)直接交互的底層代碼,由于這些代碼不可被重復(fù)調(diào)用,因此它是線程不安全的。

Swing中包括兩類線程。第一類是初始線程(Initial Threads),此類線程將執(zhí)行初始化應(yīng)用代碼。第二類是事件派發(fā)線程(The event dispatch thread,EDT),所有的事件處理代碼在這里執(zhí)行。

Main方法運(yùn)行在初始化線程上。初始化線程讀取程序參數(shù)并初始化對(duì)象,啟動(dòng)程序的圖形用戶界面。而圖形界面啟動(dòng)后,初始化線程工作基本結(jié)束。

Swing程序只有一個(gè)事件派發(fā)線程,該線程負(fù)責(zé)GUI組件的繪制和更新,通過(guò)調(diào)用程序的事件處理器來(lái)響應(yīng)用戶交互。由于所有事件處理都是在事件派發(fā)線程上進(jìn)行,包括程序同界面組件等的交互,因此所有其上的任務(wù)應(yīng)該盡快完成,以便界面能及時(shí)響應(yīng)用戶輸入。

1.2 事件派發(fā)線程更新界面組件

在事件派發(fā)線程中執(zhí)行代碼有兩種方法:SwingUtiinlities下的靜態(tài)方法invokeAndWait()和invokeLater()。它們都使事件派發(fā)線程上的可運(yùn)行對(duì)象排隊(duì)。當(dāng)可運(yùn)行對(duì)象排在事件派發(fā)隊(duì)列的隊(duì)首時(shí),就調(diào)用其run方法。其效果是允許事件派發(fā)線程調(diào)用另一個(gè)線程中的任意一個(gè)代碼塊。invokeLater()方法會(huì)立即返回,不等待事件派發(fā)線程執(zhí)行指定代碼, invokeAndWait()方法會(huì)等事件派發(fā)線程執(zhí)行了指定代碼才返回。

這里分析事件派發(fā)線程更新組件的機(jī)制。首先,創(chuàng)建一個(gè)Runnable對(duì)象,它的run()方法完成組件的狀態(tài)更新操作。SwingUtilities接受該對(duì)象,將其傳給SystemEventQueueUtilities類。該類將Runnable對(duì)象包裝后添加到系統(tǒng)事件隊(duì)列,運(yùn)行這個(gè)事件時(shí),run()方法被執(zhí)行。

2 Swing同步與多線程策略

Swing事件的處理代碼在單獨(dú)的事件派發(fā)線程中執(zhí)行。因此遇到耗時(shí)任務(wù)時(shí),不可直接放在事件派發(fā)線程中執(zhí)行,否則響應(yīng)遲鈍界面會(huì)卡住。對(duì)于耗時(shí)任務(wù),需要新的一個(gè)線程來(lái)處理。

由于系統(tǒng)事件隊(duì)列采用單一線程來(lái)執(zhí)行事件,因此Swing的同步解決策略,就是長(zhǎng)時(shí)間的任務(wù)調(diào)用,用一個(gè)后臺(tái)線程,在事件隊(duì)列處理之外來(lái)處理,這里給出方案代碼。

彭山县| 莆田市| 南华县| 伊通| 康乐县| 昭苏县| 大姚县| 神农架林区| 陆良县| 惠州市| 辽阳市| 大港区| 建德市| 巴南区| 锦州市| 黄浦区| 黎平县| 隆林| 延庆县| 清河县| 柳林县| 磴口县| 潞城市| 阜新市| 延庆县| 曲松县| 武汉市| 东平县| 南陵县| 循化| 咸宁市| 涟源市| 交口县| 揭阳市| 栾川县| 正宁县| 仁寿县| 沧州市| 阜宁县| 陕西省| 湘西|