`

j2ME多线程网络编程

阅读更多

   

网络编程中的多线程

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

  当程序运行的时候,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();//定义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;}
 else if(c==backCommand){
……
 }
}

  结束语

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

 

 

分享到:
评论

相关推荐

    J2ME移动开发实战教学视频(9.多线程.rar)

    9. 多线程 10. 数值运算,字符串处理,时间管理 11. 随机数,集合和定时器 12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket...

    tengge手机端j2me编程教程完整版

    ┃3.3 多线程与控制物体移动 ┃3.4 图片的裁剪 ┃3.5 改变原点位置 ┃3.6 画布画面之间的切换 ┃3.7 图片的翻转 ┃3.8 绘制透明图片 ┃第三章教程打包下载 ┗━━━━━━━━━━━ ┌第四章 j2me游戏开发基础 ┃...

    郭克华 J2ME视频配套课件 及源码 ppt

    09多线程 10数值运算,字符串处理,时间管理 11随机数,集合和定时器 低级界面开发 12画布开发1:Canvas绘图 13画布开发2:按键和指针事件 14案例2 游戏开发 22GameAPI1:游戏画布,图层和游戏精灵 23GameAPI2:Sprite碰撞...

    J2ME-Servlet手机网络纸牌游戏.rar

    该程序涉及了多线程、网络编程,客户端和服务器的网络通讯构架是程序的核心,不是我凭空写的,是看懂了书上的例程(3000行代码),从中取出来的,然后在上面实现了我的blackjack纸牌游戏 开发工具 myeclipse (添加j2me...

    Java案例精粹150例代码

    本书通过150个实例全面介绍了Java编程基础、多线程编程、输入/输出编程、Applet编程、Swing图形界面编程、多媒体和图形图像处理编程、网络编程、数据库编程、B/S结构编程、Web Service编程、EJB编程、安全性编程、...

    tengge py for s60编程教程

    2.3线程的挂起与释放 2.4查看系统信息 2.5数学计算 2.6让手机说话 2.7文字格式的处理 2.8文本的保存与读取 2.9修改左右键名称 3.0折叠界面 3.1对字符串操作的函数 3.2启动程序和程序列表 3.3对列表操作的函数 3.4...

    用Javac#开发手机程序及移动应用

    多线程编程;即时消息传送;I/O及网络编程;数据库编程;多媒体编程及游戏编程;基于C#开发ASP.NET移动控件以及适应不同设备的WAP应用;WebService及移动应用,包括:日程、天气、股票、地图、短信、IP等;其他高级...

    3. 高级界面开发2Command事件和List

    9. 多线程 10. 数值运算,字符串处理,时间管理 11. 随机数,集合和定时器 12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket...

    javac#开发手机程序及移动应用

    ch05 多线程编程 ch06 I/O及网络编程 ch07 数据库RMS编程 ch08 浮点数编程 ch09 多媒体及GAME API编程 ch10 安全、加密及代码优化 ch11 扩展类库及供应商提供的API ch12 与服务端联合搭建移动应用 ch13 XML ...

    3.高级界面开发2Command事件和List1\03-2.swf

    9. 多线程 10. 数值运算,字符串处理,时间管理 11. 随机数,集合和定时器 12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket...

    3.高级界面开发2Command事件和List1\03-3.swf

    9. 多线程 10. 数值运算,字符串处理,时间管理 11. 随机数,集合和定时器 12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket...

    1. 体系介绍和环境配置

    9. 多线程 10. 数值运算,字符串处理,时间管理 11. 随机数,集合和定时器 12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket...

    java学习笔记

    java多线程编程 java ee基础1 java面向对象编程--数据库编程-->java se java 基础2 html--css--javascript-->div+css java ee中级部分 Servlet--Jsp-->mvc模式 java ee高级部分 Struts--Ejb--Hibernate-...

    韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)-共448页.docx

    java多线程编程 java ee基础1 java面向对象编程--数据库编程-->java se java 基础2 html--css--javascript-->div+css java ee中级部分 Servlet--Jsp-->mvc模式 java ee高级部分 Struts--Ejb--Hibernate--Spring--...

    java手机软件开发资料全集

    java手机软件开发资料全集 资料清单: ...6、Java多线程编程 7、java手机编程教程 8、java手机程序设计入门 9、JAVA手机精品 10、Java手机游戏开发源代码 11、基于Java技术手机移动学习开发研究

    J2ME黑白棋游戏手机版 V2.1完整源码.7z

    J2ME《黑白棋》游戏手机版源代码GameCanvas版本。    1.2版更新如下:  解决了显示屏大小问题 ;  解决了图片大小的问题... 使用多线程控制游戏进度;  修改游戏的部分Bug;    2.1版更新如下:  优化了界面;

    Java语言程序设计(理论基础部分)ppt

    序号 课件章节 ...8 第七章 多线程与异常处理 9 第八章 数据流(1) 10 第八章 数据流(2) 11 第九章 网络编程 12 第十章 Java数据库连接 13 第十一章 数据结构及算法分析 14 第十二章 J2ME基础

Global site tag (gtag.js) - Google Analytics