浅析J2ME中多线程网络连接编程

引言

J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,它与J2SE、J2EE并 称。J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂 窝电话、可视电话、数字机顶盒和汽车导航系统等等。即J2ME是为消费电子产品 和手持设备量身定制的Java专用版本。

J2ME的出现使开发跨平台的消费类电子产品的应用软件成为可能。Java语言 的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程 序。它提供了基于HTTP的高级Internet协议,使移动电话能以Client/Server方 式直接访问Internet的全部信息,从而使得不同的Client访问不同的资源。

在将来的无线通信时代中,大量的网络应用程序将被开发出来去满足无线移 动通讯的要求,而要充分的发挥无线移动通讯设备的通信能力,J2ME网络编程就 变得尤为重要。那么为了高效地进行网络编程,就要利用Java语言的多线程编程 机制。

J2ME的网络连接框架(GCF)

通用连接框架(Generic Connection Framework,GCF)为资源有限的设备提 供了一个可扩展的、通用的I/O 框架。GCF 是一组在 javax.microedition.io 包中定义的接口。图 1 显示了 GCF 的类层次结构。

图1 GCF 的类层次结构

在 GCF 中共定义了七个接口 ,其中 Connection 是最基本的连接类型。且 同时提供了对数据包和流连接的支持。沿着层次结构向下派生出提供更多功能的 接口。例如, StreamConnection 接口支持输入流和输出流, ContentConnection接口又扩展了 StreamConnection 接口以支持对流的内容类 型、数据长度和编码格式的确定,HttpConnection接口又扩展了 ContentConnection接口以支持对于标准的HTTP请求。如在框架层规定的适用于 手机或双向寻呼机的移动信息设备框架MIDP(Mobile Information Device Profile)在其MIDP 1.0 规范只要求设备支持 HTTP 连接协议,而更新的 MIDP 2.0 规范要求同时支持 HTTP 和 HTTPS,后者提供了对更安全的网络连接的支持 。

网络编程中的多线程

由于目标设备具有内存小,计算能力弱和电池供电等特点,所以如何使应用程 序高效的运行就成为开发中的一个大问题.尤其针对手机等移动信息设备时,无线 通讯的特点又对我们的程序提出了更高的要求.从代码优化的角度,在网络编程中 引入多线程就显得十分重要。

当程序运行的时候,Application Management Software(应用管理软件)首先 初始化一个MIDlet,然后调用它的startApp()方法使得MIDlet进入active状态, 这条程序分支就是主线程,它执行其他的方法后都会返回到这个分支上来继续执 行。然而网络连接是个可能堵塞的操作,意味着它可能长时间都不返回。

在SUN公司的无线开发包WTK中模拟一段网络连接程序运行时,WTK会提示网络 连接工作可能会堵塞用户输入,需要创建另外一个线程去进行联网操作。针对以 上情况,引入多线程的处理机制。

1. 利用Thread类与Runnable接口

编写J2ME网络连接应用程序的时候往往借助Command显示部件,调用其事件处 理函数完成网络的连接工作,代码框架如下:

public void commandAction(Command c, Displayable s) {  if(c==sendCommand){requestConnect();//连接方法  }  else if(c==backCommand){  display.setCurrent(mainForm); }  else{destroyApp(false);notifyDestroyed(); }}// 获取一个HTTP的连接private void requestConnect() {  String url= URL.URLString  HttpConnection hpc = null;  try{hpc = (HttpConnection)ConnecTor.open(url);int status = hpc.getResponseCode();if(status != HttpConnection.HTTP_OK)  content = "联机失败!";else  content = "已联机!";  }  catch(IOException e){System.out.println(content);}  try{if(hpc != null) hpc.close();  }  catch(IOException e2){}}

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

图2 工作原理图a

分析图2可以得出,如果这样的网络连接程序在手机上运行,那么将可能长时 间得不到响应。因为连接工作只有一个主线程,所有的应用都是在这个主线程当 中进行的,如果此主线程不返回,那么就不能进行后面的行为,用户也不能进行 任何操作。

下面改进一下程序,创建一个实现Runnable接口的ConnectPipe类来创建多线 程。代码如下:

//实现Runnable接口class ConnectPipe implement Runnable{   ……   public void run(){   requestConnect();}   }

修改commandAction函数:

public void commandAction(Command c, Displayable s) {  if(c==sendCommand){//创建新线程new Thread(new ConnectPipe()).start();  }  else if(c==backCommand){……  }}

修改之后程序能够较为顺利的运行,当处理网络连接的时候,启动一个线程 后主线程会立刻返回,两个线程并行,不会引发在此地堵塞。其工作原理可用图 3的工作原理图b来表示。

图3 工作原理图b

详细分析图3,又发现尽管程序可以正常工作,但是每次用户按下按钮的时候 都会有新的线程产生,这样显然不够高效,同时,异步的行为又有可能使两个线 程间产生死锁。幸好java中提供了wait()和notify()/notifyAll()来进行线程间 的通讯,协调同步问题。那么对应本程序中的线程同步问题,设计思想如下:启 动线程后,让其进入等待的状态,当用户激活Command事件的时候唤醒线程,才 让其继续运行。代码类似如下:

public synchronized void run() {  while (dealing) {try { wait(); }//线程等待catch (InterruptedException ie) {}if (dealing) requestConnect();  }}public synchronized void deal() {  notify();//唤醒线程}

其中dealing变量用于定义一个锁,当其为true时,当前线程等待,直到用户 激活Command事件之后,调用deal()方法中的notify()唤醒当前线程继续运行。 这样程序就显得相当的高效,也在很大程度上避免了线程间的死锁问题。其工作 原理可用图4的工作原理图c来表示。

图4 工作原理图c

2. 利用系统类Timer和TimerTask

系统类Timer类是一个计时器,和TimerTask类结合可以来实现在MIDlet中定 时执行特定任务。需要说明的是每一个Timer对象实际上都是一个后台运行的独 立的线程。这是因为调度一次的任务都是由TimerTask类的实现对象负责, TimerTask类是一个抽象类,它的主要特点是实现了Runnable接口,因此扩展了 必须实现的public void run()方法。

所以,在J2ME的网络编程中,我们可以利用Timer类和TimerTask类来建立线 程,完成网络连接等工作。设计思想如下:创建一个Timer类计时器,一个完成 网络连接功能的TimerTask类,在系统空闲时,反复调度任务要求连接,直到连 接成功,再调用TimerTask类的cancel()可以停止一个具体的调度任务。核心代 码类似如下:

class ConnectTimer implement TimerTask{  ConnectTimer (){m_Timer = new Timer();//定义Timerm_Timer.schedule(this,500,5000); //调度任务  }  ……  public synchronized void run(){requestConnect();//连接方法cancel();//取消任务  }}public void commandAction(Command c, Displayable s) {  if(c==sendCommand){new ConnectTimer;}  else if(c==backCommand){……  }}

结束语

综上所述,在J2ME的应用开发中网络程序的设计具有重要的地位,而编程的 关键又在于编写高效友好的J2ME网络连接程序。通过Java语言内置的多线程处理 机制,利用线程进行同步并行处理,解决了网络连接时的阻塞问题,达到了程序 高效运行的目的。

每一个成功者都有一个开始。勇于开始,才能找到成功的路。

浅析J2ME中多线程网络连接编程

相关文章:

你感兴趣的文章:

标签云: