|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net里有这些工具吗?要简单多少?。编程|多线程|收集 摘要先容并剖析了J2ME的通用收集毗连框架(GCF),并以此为基本,指出了在J2ME收集毗连编程中存在的成绩,并提出了经由过程构建多线程的两种办理办法。
关头词J2MEGCF多线程收集毗连
弁言
J2ME(Java2MicroEdition)是Java2的一个构成部分,它与J2SE、J2EE并称。J2ME是一种高度优化的Java运转情况,次要针抵消费类电子设备的,比方蜂窝德律风、可视德律风、数字机顶盒和汽车导航体系等等。即J2ME是为消耗电子产物和手持设备量身定制的Java公用版本。
J2ME的呈现使开辟跨平台的消耗类电子产物的使用软件成为大概。Java言语的与平台有关的特征移植到小型电子设备上,同意挪动无线设备之间共享使用程序。它供应了基于HTTP的初级Internet协定,使挪动德律风能以Client/Server体例间接会见Internet的全体信息,从而使得分歧的Client会见分歧的资本。
在未来的无线通讯时期中,大批的收集使用程序将被开辟出往复满意无线挪动通信的请求,而要充实的发扬无线挪动通信设备的通讯才能,J2ME收集编程就变得尤其主要。那末为了高效地举行收集编程,就要使用Java言语的多线程编程机制。
1、J2ME的收集毗连框架(GCF)
通用毗连框架(GenericConnectionFramework,GCF)为资本无限的设备供应了一个可扩大的、通用的I/O框架。GCF是一组在javax.microedition.io包中界说的接口。显现了GCF的类条理布局。
GCF的类条理布局
在GCF中共界说了七个接口,个中Connection是最基础的毗连范例。且同时供应了对数据包和留连接的撑持。沿着条理布局向下派生出供应更多功效的接口。比方,StreamConnection接口撑持输出流和输入流,ContentConnection接口又扩大了StreamConnection接口以撑持对流的内容范例、数据长度和编码格局切实其实定,HttpConnection接口又扩大了ContentConnection接口以撑持关于尺度的HTTP哀求。如在框架层划定的合用于手机或双向寻呼机的挪动信息设备框架MIDP(MobileInformationDeviceProfile)在其MIDP1.0标准只需求设备撑持HTTP毗连协定,而更新的MIDP2.0标准请求同时撑持HTTP和HTTPS,后者供应了对更平安的收集毗连的撑持。
2、收集编程中的多线程
因为方针设备具有内存小,盘算才能弱和电池供电等特性,以是怎样使使用程序高效的运转就成为开辟中的一个年夜成绩.特别针敌手机等挪动信息设备时,无线通信的特性又对我们的程序提出了更高的请求.从代码优化的角度,在收集编程中引进多线程就显得非常主要。
当程序运转的时分,ApplicationManagementSoftware(使用办理软件)起首初始化一个MIDlet,然后挪用它的startApp()办法使得MIDlet进进active形态,这条程序分支就是主线程,它实行其他的办法后城市前往到这个分支下去持续实行。但是收集毗连是个大概梗塞的操纵,意味着它大概长工夫都不前往。
在SUN公司的无线开辟包WTK中摹拟一段收集毗连程序运转时,WTK会提醒收集毗连事情大概会梗塞用户输出,必要创立别的一个线程往举行联网操纵。针对以下情况,引进多线程的处置机制。
2.1使用Thread类与Runnable接口
编写J2ME收集毗连使用程序的时分常常借助Command显现部件,挪用其事务处置函数完成收集的毗连事情,代码框架以下:
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="联机失利!";
else
content="已联机!";
}
catch(IOExceptione){System.out.println(content);}
try{
if(hpc!=null)hpc.close();
}
catch(IOExceptione2){}}
下面的程序事情道理可用的事情道理图a来暗示。
事情道理图a
剖析能够得出,假如如许的收集毗连程序在手机上运转,那末将大概长工夫得不到呼应。由于毗连事情只要一个主线程,一切的使用都是在这个主线程傍边举行的,假如此主线程不前往,那末就不克不及举行前面的举动,用户也不克不及举行任何操纵。
<P> 上面改善一下程序,创立一个完成Runnable接口的ConnectPipe类来创立多线程。代码以下:
//完成Runnable接口
classConnectPipeimplementRunnable{
……
publicvoidrun(){
requestConnect();}
}
修正commandAction函数:
publicvoidcommandAction(Commandc,Displayables){
if(c==sendCommand){
//创立新线程
newThread(newConnectPipe()).start();
}
elseif(c==backCommand){
……
}
}
修正以后程序可以较为顺遂的运转,当处置收集毗连的时分,启动一个线程后主线程会立即前往,两个线程并行,不会激发在此地梗塞。其事情道理可用的事情道理图b来暗示。
事情道理图b
具体剖析,又发明只管程序能够一般事情,可是每次用户按下按钮的时分城市有新的线程发生,如许明显不敷高效,同时,异步的举动又有大概使两个线程间发生逝世锁。幸亏java中供应了wait()和notify()/notifyAll()来举行线程间的通信,和谐同步成绩。那末对应本程序中的线程同步成绩,计划头脑以下:启动线程后,让其进进守候的形态,当用户激活Command事务的时分叫醒线程,才让其持续运转。代码相似以下:
publicsynchronizedvoidrun(){
while(dealing){
try{wait();}//线程守候
catch(InterruptedExceptionie){}
if(dealing)requestConnect();
}
}
publicsynchronizedvoiddeal(){
notify();//叫醒线程
}
个中dealing变量用于界说一个锁,当其为true时,以后线程守候,直到用户激活Command事务以后,挪用deal()办法中的notify()叫醒以后线程持续运转。如许程序就显得相称的高效,也在很年夜水平上制止了线程间的逝世锁成绩。其事情道理可用的事情道理图c来暗示。
事情道理图c
2.2使用体系类Timer和TimerTask
体系类Timer类是一个计时器,和TimerTask类分离能够来完成在MIDlet中准时实行特定义务。必要申明的是每个Timer对象实践上都是一个背景运转的自力的线程。这是由于调剂一次的义务都是由TimerTask类的完成对象卖力,TimerTask类是一个笼统类,它的次要特性是完成了Runnable接口,因而扩大了必需完成的publicvoidrun()办法。
以是,在J2ME的收集编程中,我们能够使用Timer类和TimerTask类来创建线程,完成收集毗连等事情。计划头脑以下:创立一个Timer类计时器,一个完成收集毗连功效的TimerTask类,在体系余暇时,重复调剂义务请求毗连,直到毗连乐成,再挪用TimerTask类的cancel()能够中断一个详细的调剂义务。中心代码相似以下:
classConnectTimerimplementTimerTask{
ConnectTimer(){
m_Timer=newTimer();//界说Timer
m_Timer.schedule(this,500,5000);//调剂义务
}
……
publicsynchronizedvoidrun(){
requestConnect();//毗连办法
cancel();//作废义务
}
}
publicvoidcommandAction(Commandc,Displayables){
if(c==sendCommand){
newConnectTimer;}
elseif(c==backCommand){
……
}
}
3、停止语
综上所述,在J2ME的使用开辟中收集程序的计划具有主要的位置,而编程的关头又在于编写高效友爱的J2ME收集毗连程序。经由过程Java言语内置的多线程处置机制,使用线程举行同步并行处置,办理了收集毗连时的堵塞成绩,到达了程序高效运转的目标。
先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。 |
|