當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]J2ME中多線程網(wǎng)絡(luò)連接編程的分析

介紹并分析了J2ME的通用網(wǎng)絡(luò)連接框架(GCF),并以此為基礎(chǔ),指出了在J2ME網(wǎng)絡(luò)連接編程中存在的問題,并提出了通過構(gòu)建多線程的兩種解決方法。

關(guān)鍵詞J2MEGCF多線程網(wǎng)絡(luò)連接

引言

J2ME(Java2MicroEdition)是Java2的一個組成部分,它與J2SE、J2EE并稱。J2ME是一種高度優(yōu)化的Java運(yùn)行環(huán)境,主要針對消費(fèi)類電子設(shè)備的,例如蜂窩電話、可視電話、數(shù)字機(jī)頂盒和汽車導(dǎo)航系統(tǒng)等等。即J2ME是為消費(fèi)電子產(chǎn)品和手持設(shè)備量身定制的Java專用版本。

J2ME的出現(xiàn)使開發(fā)跨平臺的消費(fèi)類電子產(chǎn)品的應(yīng)用軟件成為可能。Java語言的與平臺無關(guān)的特性移植到小型電子設(shè)備上,允許移動無線設(shè)備之間共享應(yīng)用程序。它提供了基于HTTP的高級Internet協(xié)議,使移動電話能以Client/Server方式直接訪問Internet的全部信息,從而使得不同的Client訪問不同的資源。

在將來的無線通信時代中,大量的網(wǎng)絡(luò)應(yīng)用程序?qū)⒈婚_發(fā)出來去滿足無線移動通訊的要求,而要充分的發(fā)揮無線移動通訊設(shè)備的通信能力,J2ME網(wǎng)絡(luò)編程就變得尤為重要。那么為了高效地進(jìn)行網(wǎng)絡(luò)編程,就要利用Java語言的多線程編程機(jī)制。

1、J2ME的網(wǎng)絡(luò)連接框架(GCF)

通用連接框架(GenericConnectionFramework,GCF)為資源有限的設(shè)備提供了一個可擴(kuò)展的、通用的I/O框架。GCF是一組在javax.microedition.io包中定義的接口。圖1顯示了GCF的類層次結(jié)構(gòu)。

圖1GCF的類層次結(jié)構(gòu)

在GCF中共定義了七個接口,其中Connection是最基本的連接類型。且同時提供了對數(shù)據(jù)包和流連接的支持。沿著層次結(jié)構(gòu)向下派生出提供更多功能的接口。例如,StreamConnection接口支持輸入流和輸出流,ContentConnection接口又?jǐn)U展了StreamConnection接口以支持對流的內(nèi)容類型、數(shù)據(jù)長度和編碼格式的確定,HttpConnection接口又?jǐn)U展了ContentConnection接口以支持對于標(biāo)準(zhǔn)的HTTP請求。如在框架層規(guī)定的適用于手機(jī)或雙向?qū)ず魴C(jī)的移動信息設(shè)備框架MIDP(MobileInformationDeviceProfile)在其MIDP1.0規(guī)范只要求設(shè)備支持HTTP連接協(xié)議,而更新的MIDP2.0規(guī)范要求同時支持HTTP和HTTPS,后者提供了對更安全的網(wǎng)絡(luò)連接的支持。

2、網(wǎng)絡(luò)編程中的多線程

由于目標(biāo)設(shè)備具有內(nèi)存小,計(jì)算能力弱和電池供電等特點(diǎn),所以如何使應(yīng)用程序高效的運(yùn)行就成為開發(fā)中的一個大問題.尤其針對手機(jī)等移動信息設(shè)備時,無線通訊的特點(diǎn)又對我們的程序提出了更高的要求.從代碼優(yōu)化的角度,在網(wǎng)絡(luò)編程中引入多線程就顯得十分重要。

當(dāng)程序運(yùn)行的時候,ApplicationManagementSoftware(應(yīng)用管理軟件)首先初始化一個MIDlet,然后調(diào)用它的startApp()方法使得MIDlet進(jìn)入active狀態(tài),這條程序分支就是主線程,它執(zhí)行其他的方法后都會返回到這個分支上來繼續(xù)執(zhí)行。然而網(wǎng)絡(luò)連接是個可能堵塞的操作,意味著它可能長時間都不返回。

在SUN公司的無線開發(fā)包WTK中模擬一段網(wǎng)絡(luò)連接程序運(yùn)行時,WTK會提示網(wǎng)絡(luò)連接工作可能會堵塞用戶輸入,需要創(chuàng)建另外一個線程去進(jìn)行聯(lián)網(wǎng)操作。針對以上情況,引入多線程的處理機(jī)制。

2.1利用Thread類與Runnable接口

編寫J2ME網(wǎng)絡(luò)連接應(yīng)用程序的時候往往借助Command顯示部件,調(diào)用其事件處理函數(shù)完成網(wǎng)絡(luò)的連接工作,代碼框架如下:

publicvoidcommandAction(Commandc,Displayables){

if(c==sendCommand){

requestConnect();//連接方法

}

elseif(

c==backCommand){

display.setCurrent(mainForm);}

else{

destroyApp(false);

notifyDestroyed();}

}

//獲取一個HTTP的連接

privatevoidrequestConnect(){

Stringurl=URL.URLString

HttpConnectionhpc=null;

try{

hpc=(HttpConnection)Connector.open(url);

intstatus=hpc.getResponseCode();

if(status!=HttpConnection.HTTP_OK)

content="聯(lián)機(jī)失敗!";

else

content="已聯(lián)機(jī)!";

}

catch(IOExceptione){System.out.println(content);}

try{

if(hpc!=null)hpc.close();

}

catch(IOExceptione2){}}

上面的程序工作原理可用圖2的工作原理圖a來表示。

圖2工作原理圖a

圖2工作原理圖a

分析圖2可以得出,如果這樣的網(wǎng)絡(luò)連接程序在手機(jī)上運(yùn)行,那么將可能長時間得不到響應(yīng)。因?yàn)檫B接工作只有一個主線程,所有的應(yīng)用都是在這個主線程當(dāng)中進(jìn)行的,如果此主線程不返回,那么就不能進(jìn)行后面的行為,用戶也不能進(jìn)行任何操作。

下面改進(jìn)一下程序,創(chuàng)建一個實(shí)現(xiàn)Runnable接口的ConnectPipe類來創(chuàng)建多線程。代碼如下

//實(shí)現(xiàn)Runnable接口

classConnectPipeimplementRunnable{

……

publicvoidrun(){

requestConnect();}

}

修改commandAction函數(shù):

publicvoidcommandAction(Commandc,Displayables){

if(c==sendCommand){

//創(chuàng)建新線程

newThread(newConnectPipe()).start();

}

elseif(c==backCommand){

……

}

}

修改之后程序能夠較為順利的運(yùn)行,當(dāng)處理網(wǎng)絡(luò)連接的時候,啟動一個線程后主線程會立刻返回,兩個線程并行,不會引發(fā)在此地堵塞。其工作原理可用圖3的工作原理圖b來表示。

圖3工作原理圖b

詳細(xì)分析圖3,又發(fā)現(xiàn)盡管程序可以正常工作,但是每次用戶按下按鈕的時候都會有新的線程產(chǎn)生,這樣顯然不夠高效,同時,異步的行為又有可能使兩個線程間產(chǎn)生死鎖。幸好java中提供了wait()和notify()/notifyAll()來進(jìn)行線程間的通訊,協(xié)調(diào)同步問題。那么對應(yīng)本程序中的線程同步問題,設(shè)計(jì)思想如下:啟動線程后,讓其進(jìn)入等待的狀態(tài),當(dāng)用戶激活Command事件的時候喚醒線程,才讓其繼續(xù)運(yùn)行。代碼類似如下:

publicsynchronizedvoidrun(){

while(dealing){

try{wait();}//線程等待

catch(InterruptedExceptionie){}

if(dealing)requestConnect();

}

}

publicsynchronizedvoiddeal(){

notify();//喚醒線程

}

其中dealing變量用于定義一個鎖,當(dāng)其為true時,當(dāng)前線程等待,直到用戶激活Command事件之后,調(diào)用deal()方法中的notify()喚醒當(dāng)前線程繼續(xù)運(yùn)行。這樣程序就顯得相當(dāng)?shù)母咝?,也在很大程度上避免了線程間的死鎖問題。其工作原理可用圖4的工作原理圖c來表示。

圖4工作原理圖c

2.2利用系統(tǒng)類Timer和TimerTask

系統(tǒng)類Timer類是一個計(jì)時器,和TimerTask類結(jié)合可以來實(shí)現(xiàn)在MIDlet中定時執(zhí)行特定任務(wù)。需要說明的是每一個Timer對象實(shí)際上都是一個后臺運(yùn)行的獨(dú)立的線程。這是因?yàn)檎{(diào)度一次的任務(wù)都是由TimerTask類的實(shí)現(xiàn)對象負(fù)責(zé),TimerTask類是一個抽象類,它的主要特點(diǎn)是實(shí)現(xiàn)了Runnable接口,因此擴(kuò)展了必須實(shí)現(xiàn)的publicvoidrun()方法。

所以,在J2ME的網(wǎng)絡(luò)編程中,我們可以利用Timer類和TimerTask類來建立線程,完成網(wǎng)絡(luò)連接等工作。設(shè)計(jì)思想如下:創(chuàng)建一個Timer類計(jì)時器,一個完成網(wǎng)絡(luò)連接功能的TimerTask類,在系統(tǒng)空閑時,反復(fù)調(diào)度任務(wù)要求連接,直到連接成功,再調(diào)用TimerTask類的cancel()可以停止一個具體的調(diào)度任務(wù)。核心代碼類似如下:

classConnectTimerimplementTimerTask{

ConnectTimer(){

m_Timer=newTimer();//定義Timer

m_Timer.schedule(this,500,5000);//調(diào)度任務(wù)

}

……

publicsynchronizedvoidrun(){

requestConnect();//連接方法

cancel();//取消任務(wù)

}

}

publicvoidcommandAction(Commandc,Displayables){

if(c==sendCommand){

newConnectTimer;}

elseif(c==backCommand){

……

}

}

3、結(jié)束語

綜上所述,在J2ME的應(yīng)用開發(fā)中網(wǎng)絡(luò)程序的設(shè)計(jì)具有重要的地位,而編程的關(guān)鍵又在于編寫高效友好的J2ME網(wǎng)絡(luò)連接程序。通過Java語言內(nèi)置的多線程處理機(jī)制,利用線程進(jìn)行同步并行處理,解決了網(wǎng)絡(luò)連接時的阻塞問題,達(dá)到了程序高效運(yùn)行的目的

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉