快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
!";   }   catch(IOException e){System.out.println(content);}   try{ if(hpc != null) hpc.close();   }   catch(IOException e2){}}

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

时间:2011-06-16 cndym

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

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

图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来表示。

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

图3 工作原理图b

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

时间:2011-06-16 cndym

详细分析图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来表示。

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

图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();//定义Timer m_Timer.schedule(this,500,5000); //调度任务   }   ……   public synchronized void run(){ requestConnect();//连接方法 cancel();//取消任务   } } public void commandAction(Command c, Displayable s) {   if(c==sendCommand){ new ConnectTimer;}  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号