兰色精灵 发表于 2015-1-18 11:15:16

JAVA网页编程之J2ME中多线程收集毗连编程的剖析

诸如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原来也有许多缺点。

小魔女 发表于 2015-1-29 14:36:22

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

蒙在股里 发表于 2015-2-4 14:33:09

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

再见西城 发表于 2015-2-10 01:42:32

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

愤怒的大鸟 发表于 2015-2-26 11:22:52

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

透明 发表于 2015-3-8 14:05:37

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

兰色精灵 发表于 2015-3-16 00:44:29

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

admin 发表于 2015-3-22 18:10:55

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
页: [1]
查看完整版本: JAVA网页编程之J2ME中多线程收集毗连编程的剖析