网络编程中的多线程
由于目标设备具有内存小,计算能力弱和电池供电等特点,所以如何使应用程序高效的运行就成为开发中的一个大问题.尤其针对手机等移动信息设备时,无线通讯的特点又对我们的程序提出了更高的要求.从代码优化的角度,在网络编程中引入多线程就显得十分重要。
当程序运行的时候,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语言内置的多线程处理机制,利用线程进行同步并行处理,解决了网络连接时的阻塞问题,达到了程序高效运行的目的。
分享到:
相关推荐
在Java Micro Edition (J2ME)中,线程和网络编程是两个至关重要的概念,尤其对于开发移动设备上的应用程序来说。J2ME为资源有限的设备提供了轻量级的Java平台,因此理解和掌握这两个主题是编写高效、响应式以及能够...
**J2ME GPRS网络编程详解** Java 2 Micro Edition(J2ME)是Java平台的一个子集,专为资源有限的嵌入式设备,如移动电话和掌上电脑设计。在移动通信领域,J2ME是进行网络编程的重要工具,特别是通过GPRS(General ...
**正文** ...通过分析和修改这个示例,开发者可以深化对J2ME和多线程编程的理解,进一步提升自己的编程技能。无论是游戏开发还是其他类型的J2ME应用,掌握多线程都是提高用户体验和程序性能的关键。
3. **多线程**:由于网络操作通常涉及阻塞I/O,使用多线程可以避免应用程序在等待网络响应时阻塞。 4. **错误处理**:网络连接可能出现各种异常,因此需要编写健壮的错误处理机制。 5. **安全性**:考虑数据加密和...
9. 多线程 10. 数值运算,字符串处理,时间管理 11. 随机数,集合和定时器 12. 画布开发1Canvas绘图 13. 画布开发2按键和指针事件 14. 案例2 15. RMS编程1基础知识 16. RMS编程2高级知识 17. 案例3 18. 网络编程1Socket...
8. **多线程**: - 通常,服务器端需要为每个客户端创建一个新的线程来处理请求,以实现并发服务,避免阻塞其他客户端的连接。 9. **安全通信**: - J2ME 还支持安全 Socket,即 SSL (Secure Sockets Layer) 或 ...
┃3.3 多线程与控制物体移动 ┃3.4 图片的裁剪 ┃3.5 改变原点位置 ┃3.6 画布画面之间的切换 ┃3.7 图片的翻转 ┃3.8 绘制透明图片 ┃第三章教程打包下载 ┗━━━━━━━━━━━ ┌第四章 j2me游戏开发基础 ┃...
8. **Chapter 11(ch11):高级主题**:这可能涉及J2ME的更多高级特性,如多线程编程,以提高应用性能,或者如何优化代码以适应资源有限的移动环境。 通过这些章节的源代码,开发者可以深入理解J2ME的各个方面,并...
总的来说,这个项目涵盖了J2ME平台的网络编程、图形界面设计、游戏逻辑实现等多个方面,是学习移动开发和网络应用的好实例。通过深入研究和理解源代码,开发者可以提升自己的Java编程技能,特别是针对移动环境的优化...
j2ME支持多线程编程,通过`Thread`类或者`Runnable`接口可以创建并管理线程。 4. **数据结构与算法**:扑克游戏涉及到牌的组合、概率计算等,因此良好的数据结构(如数组、链表、集合)和算法(如排序、搜索)设计...
本篇文章将深入探讨J2ME手机游戏编程的基础知识,帮助初学者入门。 首先,我们需要了解J2ME的架构。J2ME由两部分组成:配置(Configurations)和Profile(Profiles)。配置定义了设备的基本硬件和软件能力,比如...
总的来说,"J2ME手机游戏开发(可蓝牙对战网络编程)"项目涵盖了J2ME游戏开发的多个重要方面:图形渲染、蓝牙通信、网络编程以及游戏逻辑。通过学习和实践,开发者不仅可以掌握J2ME的基本技术,还能深入了解手机游戏...
总结,J2ME手机编程涉及了从基础环境配置到实际编程实践的多个层面,包括虚拟机、应用结构、UI设计、网络通信和数据管理等方面。掌握这些知识点,开发者可以创建出在各种移动设备上运行的应用程序。
为了优化性能,应尽量减少对 Record Store 的读写操作,尤其是在网络连接不稳定或资源有限的移动设备上。批量处理记录(如一次性添加或更新多个记录)通常比单个处理更有效率。另外,定期备份 Record Store 数据以...
为了确保用户体验的流畅性,聊天应用可能需要使用多线程。主线程处理用户界面,而其他线程负责后台任务,如网络通信。这样可以防止用户界面因长时间等待网络响应而冻结。 **安全性与优化** 考虑到J2ME应用运行在...
【标题】"j2me五子棋...通过分析这个项目的源代码,开发者可以学习到J2ME环境下的游戏开发、网络编程、多线程处理以及游戏逻辑的设计等多个方面的知识。这对于想要从事移动游戏开发的人来说,是一个宝贵的教育资源。
总结来说,通过J2ME开发飞机游戏,开发者需要掌握MIDP和CLDC的基本概念,熟悉Canvas的绘图机制,理解事件处理和游戏逻辑,以及可能涉及的网络编程。对于初学者而言,这是一个很好的实践项目,不仅可以学习到基础的...
5. **多线程**:为了保证游戏的流畅性,源代码可能会使用多线程技术,一个线程处理用户输入和界面更新,另一个线程负责网络通信,避免阻塞。 6. **错误处理**:考虑到网络环境的不稳定性和设备的多样性,良好的错误...
总之,《J2ME手机游戏编程入门》实例源代码包含了一系列实践示例,涵盖了从基础的图形绘制到复杂的网络通信等多个方面,是学习J2ME游戏开发的宝贵参考资料。通过深入研究这些代码,开发者可以逐步掌握J2ME游戏编程的...
6. **多线程编程**:J2ME中的线程管理对于实现后台任务和提升用户体验至关重要。 7. **网络服务集成**:如XML解析、SOAP通信,以及与Web服务的交互。 8. **资源管理**:在有限的内存和存储条件下,有效地管理和...