《J2ME中多线程网络连接编程的分析》由会员分享,可在线阅读,更多相关《J2ME中多线程网络连接编程的分析(4页珍藏版)》请在金锄头文库上搜索。
1、1J2ME 中多线程网络连接编程的分析摘 要 介绍并分析了 J2ME 的通用网络连接框架(GCF),并以此为基础,指出了在 J2ME 网络连接编程中存在的问题,并提出了通过构建多线程的两种解决方法。 关键词 J2ME GCF 多线程 网络连接0 引言J2ME(Java 2 Micro Edition)是 Java 2 的一个组成部分,它与 J2SE、J2EE 并称。J2ME 是一种高度优化的 Java 运行环境,主要针对消费类电子设备的,例如蜂窝电话、可视电话、数字机顶盒和汽车导航系统等等。即 J2ME 是为消费电子产品和手持设备量身定制的 Java 专用版本。J2ME 的出现使开发跨平台的消
2、费类电子产品的应用软件成为可能。Java 语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。它提供了基于 HTTP 的高级 Internet 协议,使移动电话能以 Client/Server 方式直接访问 Internet 的全部信息,从而使得不同的 Client 访问不同的资源。在将来的无线通信时代中,大量的网络应用程序将被开发出来去满足无线移动通讯的要求,而要充分的发挥无线移动通讯设备的通信能力,J2ME 网络编程就变得尤为重要。那么为了高效地进行网络编程,就要利用 Java 语言的多线程编程机制。1 J2ME 的网络连接框架(GCF)通用连接框架(Generi
3、c Connection Framework,GCF)为资源有限的设备提供了一个可扩展的、通用的 I/O 框架。GCF 是一组在 javax.microedition.io 包中定义的接口。图 1 显示了 GCF 的类层次结构。2图 1 GCF 的类层次结构在 GCF 中共定义了七个接口 ,其中 Connection 是最基本的连接类型。且同时提供了对数据包和流连接的支持。沿着层次结构向下派生出提供更多功能的接口。例如, StreamConnection 接口支持输入流和输出流, ContentConnection 接口又扩展了 StreamConnection 接口以支持对流的内容类型、数据
4、长度和编码格式的确定,HttpConnection 接口又扩展了 ContentConnection 接口以支持对于标准的HTTP 请求。如在框架层规定的适用于手机或双向寻呼机的移动信息设备框架MIDP(Mobile Information Device Profile)在其 MIDP 1.0 规范只要求设备支持 HTTP 连接协议,而更新的 MIDP 2.0 规范要求同时支持 HTTP 和 HTTPS,后者提供了对更安全的网络连接的支持。2 网络编程中的多线程由于目标设备具有内存小,计算能力弱和电池供电等特点,所以如何使应用程序高效的运行就成为开发中的一个大问题.尤其针对手机等移动信息设备时
5、,无线通讯的特点又对我们的程序提出了更高的要求.从代码优化的角度,在网络编程中引入多线程就显得十分重要.当程序运行的时候,Application Management Software(应用管理软件)首先初始化一个 MIDlet,然后调用它的 startApp()方法使得 MIDlet 进入 active 状态,这条程序分支就是主线程,它执行其他的方法后都会返回到这个分支上来继续执行。然而网络连接是个可能堵塞的操作,意味着它可能长时间都不返回。在 SUN 公司的无线开发包 WTK 中模拟一段网络连接程序运行时,WTK 会提示网络连接工作可能会堵塞用户输入,需要创建另外一个线程去进行联网操作。针
6、对以上情况,引入多线程的处理机制。32.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(); / 获取一个
7、 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 = “联机失败!“;elsecontent = “已联机!“;catch(IOException e)System.out.println(content);tr
8、yif(hpc != null) hpc.close();catch(IOException e2)上面的程序工作原理可用图 2 的工作原理图 a 来表示。图 2 工作原理图 a分析图 2 可以得出,如果这样的网络连接程序在手机上运行,那么将可能长时间得不到响应。因为连接工作只有一个主线程,所有的应用都是在这个主线程当中4进行的,如果此主线程不返回,那么就不能进行后面的行为,用户也不能进行任何操作。下面改进一下程序,创建一个实现 Runnable 接口的 ConnectPipe 类来创建多线程。代码如下:/实现 Runnable 接口class ConnectPipe implement Ru
9、nnable 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,
10、又发现尽管程序可以正常工作,但是每次用户按下按钮的时候都会有新的线程产生,这样显然不够高效,同时,异步的行为又有可能使两个线程间产生死锁。幸好 java 中提供了 wait()和 notify()/notifyAll()来进行线程间的通讯,协调同步问题。那么对应本程序中的线程同步问题,设计思想如下:启动线程后,让其进入等待的状态,当用户激活 Command 事件的时候唤醒线程,才让其继续运5行。代码类似如下:public synchronized void run() while (dealing) try wait(); /线程等待catch (InterruptedException ie
11、) if (dealing) requestConnect(); public synchronized void deal() notify();/唤醒线程其中 dealing 变量用于定义一个锁,当其为 true 时,当前线程等待,直到用户激活 Command 事件之后,调用 deal()方法中的 notify()唤醒当前线程继续运行。这样程序就显得相当的高效,也在很大程度上避免了线程间的死锁问题。其工作原理可用图 4 的工作原理图 c 来表示。图 4 工作原理图 c2.2 利用系统类 Timer 和 TimerTask系统类 Timer 类是一个计时器,和 TimerTask 类结合可以
12、来实现在 MIDlet 中定时执行特定任务。需要说明的是每一个 Timer 对象实际上都是一个后台运行的独立的线程。这是因为调度一次的任务都是由 TimerTask 类的实现对象负责,TimerTask 类是一个抽象类,它的主要特点是实现了 Runnable 接口,因此扩展了必须实现的 public void run()方法。所以,在 J2ME 的网络编程中,我们可以利用 Timer 类和 TimerTask 类来建立线程,完成网络连接等工作。设计思想如下:创建一个 Timer 类计时器,一个完成网络连接功能的 TimerTask 类,在系统空闲时,反复调度任务要求连接,直到连接成功,再调用
13、TimerTask 类的 cancel()可以停止一个具体的调度任务。核心代码类似如下:6class 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=sendComm
14、and) new ConnectTimer; else if(c=backCommand)3 结束语综上所述,在 J2ME 的应用开发中网络程序的设计具有重要的地位,而编程的关键又在于编写高效友好的 J2ME 网络连接程序。通过 Java 语言内置的多线程处理机制,利用线程进行同步并行处理,解决了网络连接时的阻塞问题,达到了程序高效运行的目的。 参考文献1 卢军. J2ME 应用程序开发:手机、PDA 程序开发捷径M.中国铁道出版社,20022 黄聪明. Java 移动通信程序设计M. 清华大学出版社,20023 (美)James Keogh. J2ME 开发大全M. 清华大学出版社,20044 Leopold Lee . J2ME 手机编程基础M. 清华大学出版社,2003.5 Kim Topley. J2ME in a Nutshell (OReilly Java) (Paperback) M.2003