张 博
(长沙师范学院 电子信息工程系, 湖南 长沙 410100)
J2ME中CLDC平台执行并发多任务的研究和实现
张 博
(长沙师范学院 电子信息工程系, 湖南 长沙 410100)
J2ME为移动无线设备带来了Java语言的平台无关性,能够动态地、安全地以各种类型的网络向移动无线设备传送交互内容和应用程序,并可以按用户的需求定制应用程序。首先介绍了 J2ME平台,接着介绍了CLDC,同时对CLDC环境下多线程程序的开发及应用进行了深入探讨。最后对给出的解决方案进行了讨论并指出其实用性。
J2ME;CLDC;多任务;多线程
当前, 各种智能消费类电子产品,如移动电话、PDA、电视机顶盒等呈现爆炸性增长,其数量已经大大超过桌面PC,数字计算的重点也从单纯的面向Internet的网络计算向移动计算发展,人们希望可以随时随地以任意设备实现信息的获取和共享,进行商务贸易等。无所不在的普适网络和种类繁多、功能日益强大的终端,已经构成人们生活的重要环境—普适环境。普适环境带来了以普适网络为基础的计算环境,并且提供了多种移动终端的接入方式。在普适环境下的计算模式被认为是一种普适计算(Ubiquitous/Pervasive Computing)。J2ME技术实际上就是在普适计算环境发展背景下发展起来的。
Java移动软件平台采用的基本Java平台是CLDC (Connected Limited Device Configuration)和MIDP (Mobile Information Device Profile),是J2ME平台 (Java 2 Micro Edition)构成的一部分,常被应用于手机等移动设备上。但CLDC的Java执行与处理始终在多线程单进程状态阶段,自然也就无法满足目前用户的需要,而Java语言又具有易开发,成本低、兼容性强等特点。因此继续CLDC环境下的Java开发使用,重新构建CLDC环境结构,使其具有多任务线程的执行处理能力。
国外大多开放式J2ME平台系统也借助于CLDC环境和其丰富的软件资源。在系统体系结构上,开发了典型的CLDC设备的大体架构,且为移动设备定义了一个标准的Java平台。由于CLDC环境运行于一个宿主操作系统之上,宿主操作系统为CLDC环境虚拟机提供管理底层硬件的必备能力。国外研究者从上开发了CLDC的多线程技术,这也是实现CLDC下的多进程技术的基础。但目前国外研究者却因为市场需求的紧迫性逐步放弃了CLDC的多进程研究,从而发展LINUX架构。
国内一般将J2ME技术称为“无线Java”技术,目前国内的J2ME平台的开发一直在低端设备要求的运行情况下研发,当然存在功能需求上的不足,而市场上其他非Java平台的移动设备又造价高昂,无法适应国内市场,且目前技术水平下的CLDC平台又不能满足当前用户的需求,故而对J2ME平台的设计迫在眉睫。
Sun Microsystems 将J2ME定义为“一种以广泛的消费性产品为目标的高度优化的 Java运行时环境, 包括寻呼机、移动电话、可视电话、数字机顶盒和汽车导航系统。”由于各种移动设备具有各种不同的硬件配置,所以为它们提供一种普遍适用的开发平台几乎是不可能的,所以,J2ME定义了两种类型的规范,它们携手提供一种移动Java平台。这两种平台就是配置(configuration)和描述(Profile)。
J2ME利用配置来根据各种设备的运算能力和供电能力把设备分为CLDC(Connected Limited Device Configuration)和CDC(Connected Device Configuration)。通过配置来提供支持一组通用设备的最小Java平台,作为这类设备的最低配置来保证不同设备间的平台兼容性。这里所说的平台主要指JVM和Java核心库,在配置中舍弃了设备的特殊性来保证Java平台的兼容性,因此为了支持具体设备所独有的功能和硬件条件,J2ME提供了描述(Profile)来体现设备的特殊性。描述(Profile)是根据每类设备的功能定义的与设备特性相关的API.。
关于J2ME的体系结构,可以用图1表示。
图1 J2ME体系结构Fig. 1 J2ME system structure
J2ME的配置层将基本运行时环境定义为一组核心类和一个运行在特定类型设备上的特定JVM。虽然将来可能定义其他配置,但当前J2ME存在两种配置[1]:
1)连接限制设备配置(Connected Limited Device Configuration:CLDC)与KVM一起用于内存有限的16位或32位设备。这是用于开发小型J2ME应用程序的配置。CLDC同时还是用于开发绘图工具应用程序的配置。Palm电脑便是一个运行小应用程序的小型无线设备的示例。
2)连接设备配置(Connected Device Configuration:CDC)与C虚拟机(CVM)一起使用,用于要求内存超过2兆的32位体系结构。互联网电视机顶盒便是这类设备的一个示例。
J2ME CLDC是由 Java Community Process 创建的。正如Sun Microsystems 所定义的那样,它的标准是“轻便、覆盖区域的Java构建块,适合小型的、有资源限制的设备”[2]。使用CLDC开发的J2ME应用程序的目标设备通常具有以下特征[3]:可供Java平台使用的160到512千字节的总内存;功率有限,常常是电池供电;网络连通性,常常是无线的、不一致的连接并且带宽有限;用户接口混乱,程度参差不齐;有时根本就没有接口。J2ME CLDC配置简要描述了高度限制设备上每个J2ME执行所要求的一套最基本的库和Java虚拟机特征。CLDC主要面向那些网络连接速度慢、能源有限(经常是电池供电)、具有大于等于128 KB的稳定内存、以及大于等于32 KB的不稳定内存的设备。不稳定内存是不持久的并且没有写保护,这意味着如果关掉设备,内存中的内容将全部丢失。而稳定内存中的内容是持久的,并且有写保护。CLDC设备使用稳定内存来存储运行时的库和KVM,或存储为某个特殊设备创建的另一个虚拟机。不稳定内存被用来分配运行时的内存。CLDC定义了下列要求[4]:
1) 完整的Java语言支持(除浮点支持、最终定案和错误处理之外);
2) 完整的JVM支持;
3) CLDC的安全性;
4) 有限国际化的支持;
5) 继承类—所有不针对CLDC的类都必须是J2SE1.3类的子类。
处于“恒”开启状态的持续性数据处理应用(如即时消息和无线电子邮件等)是推动多任务处理的强有力因素。事实上可以说,在不支持多任务处理的环境中,这些应用程序根本无法运行。在Windows环境中,即时消息和电子邮件应用程序通常在后台持续运行,收到新消息或电子邮件时自动切换至前台。用户当然希望在手机上实现这种功能。与此相似,如果媒体播放器应用程序能在来电时暂停并进入后台,随后切换至前台继续播放,使用起来自然更为方便。
目前,构成移动Java部署的主要是在其自身JVM实例中运行的应用程序,且每次只运行一个程序。也就是说,Java应用程序之间的切换是通过连续方式实现的:先启动JVM,然后加载应用程序并运行。如果用户希望切换到一个新的应用程序,就要退出当前程序;在该进程重新启动之前,JVM将处于关闭状态。如果多个应用程序能够并行运行,每个程序都需要加载、分析、校验并创建所有应用程序级的运行时映像。两种方法都无法实现Java的有效多任务处理;两种方法都速度慢、效率低下而且离便于使用的目标还相距甚远。显然,我们迫切需要一种更好的Java多任务处理解决方案。多任务处理更贴近现实用户行为。现在,用户使用电脑和PDA应用程序时可以在各任务之间自由切换。要求手机达到这种性能,也是理所当然之事;随着手机和服务的不断发展,除语音通话以外,数据使用和其他任务也得到了日益完善的支持,这就令此类要求更加突出。
我们知道,在操作系统级别上软件的运行一般都是以进程为单位,而在每个进程的运行过程中允许同时并发执行多个不同线程,这就使得一个程序能同时执行不同的操作。使用多线程的目的是为了最大限度地利用计算机CPU资源。Java程序字节码最终是在JVM虚拟机下运行的,同一虚拟机进程中的不同操作都是通过多线程来运行的。在Java虚拟机中,线程常用有单线程和多线程,单线程指程序执行过程只是一个有效操作的序列,不同操作都有着明确的先后顺序;而多线程允许同时进行着不同的操作,这些不同的操作同时并发进行着,并由CPU时钟频率根据不同的调度方式对它们进行执行调度。
在手机软件设计中,由于同样需要执行网络连接(基于HTTP的高级Internet协议通讯)、UI调度等待、UI显示幻化、游戏控制等操作需要通过后台的数据运算或UI不断更新等操作。因此在J2ME中,KVM虚拟机也提供了功能强大的多线程API,使我们同样能在J2ME中实现线程的并发运算。文中将Java语言中继承Thread类(java.lang.Thread)和直接实现Runnable多线程接口(java.lang.Runnable)的优化算法灵活运用于J2ME平台的CLDC环境中实现并行多任务处理,同时创新提出使用任务组合方式来实现多线程。
通过编写线程类继承Thread类并重写Thread类中的run()方法实现线程,当线程对象被运行时候将会自动执行run方法中的实体内容,从而开辟一个单独的线程并运行起来。
当执行start方法时候,将会自动运行run方法,但是执行start方法时候只做了一件事,就是将线程转化为可执行状态,然后等待操作系统进行调度并运行,因此无法保证线程能立即启动。
线程接口Runnable中只有一个抽象方法run,通过实现Runnable接口中的方法的类即可创建出有多线程特征的对象,但该对象并无法使其启动线程,需要作为参数并借助Thread的构造方法构造创建对象并调用start方法对线程进行启动。
如:
由此可见,以上两种方法都是通过Thread的start来启动线程的,实际上所有的线程操作都是封装在Thread这个类中,由Thread对象调用各种接口来控制线程。
直接继承Thread类的方法不能再从其他类继承,编写简单,可以直接操作线程;实现Runnable接口的方法可以将CPU、代码和数据分开,形成清晰的模型,还可以继承其他类,保持程序风格的一致性,两者的重要区别在于启动多线程对象的方法设计方法不同。在具体应用中,采用哪种方法来构造线程要视情况而定,通常,当一个线程已继承了另一个类时,就只能采用第二种方法来构造,即实现Runnable接口。
在J2ME中,同样具有Java中的任务处理组合类,他们分别为Timer和TimerTask,可以使用他们实现多线程,简单说就是定时实现任务。
Timer是Java中的一个定时器,可以实现在某一时间做某件事或者在某一时间段做某些事,分别通过方法schedule(TimerTask tt,long millis) 和 schedule(TimerTask tt,long start,long off)。
TimerTask是一个任务类,通过继承该类并覆盖方法run即可创建一个任务。
//3秒钟后执行任务并且之后每5秒钟执行一次
timer.schedule(new TimerTaskS(),3000,5000);
有此可见在使用计时任务可以达到实现线程的效果,分别执行不同的并发操作,通过Timer类对象来操作TimerTask对象,通过schedule方法来计时执行任务,在结束任务的时候,通常使用cancel()来实现。
利用多线程的并发执行特点,无疑会加快程序的运行,提高CPU、内存等系统资源的使用效率,但要注意同时运行在内存中的多个线程之间的关系。由于线程执行不受建立先后的约束,线程间共享数据可能会出现程序员想象不到的事情,还有多个线程同时访问修改同一个数据、资源竞争和死锁问题,都需要程序员周密的考虑。总体来说,在程序中决定使用多线程需要权衡以下几个问题:1)创建线程需要占用更多的内存资源;2)创建线程需要增加CPU跟踪线程、切换线程的时间开销;3)多线程编程必须考虑资源共享问题、同时访问通讯端口问题以及系统资源竞争和死锁问题;4)同一任务下的多个线程同时访问和修改某个数据时,要考虑数据的安全问题。
由此看出,线程不是越多越好,而是要适度,并且对多线程编程的程序员也提高了要求。总之,多线程会使软件编程变得更加灵活,同时也给程序员带来了更大的机遇和挑战。
文中基于J2ME平台的开放式CLDC系统,利用Java 语言的可移植性、安全性和兼容性等优势,在目前CLDC多线程的情况下解决不能多进程处理的问题,实现CLDC平台的多任务功能,同时使之能适应市场上的各种软硬件资源、保证CLDC与网络连接,实现资源共享。针对不同的应用要求和应用环境,通过自由选择与配置不同的硬件与软件,使J2ME平台可面向多种设备使用,具有普适性,从而减少二次开发的成本投入和开发的周期。
[1]Sun Microsystems, Inc. JavaTM 2 Platform Micro Edition(J2METM)Technology for Greating Mobile Devices (White Paper)[P].May 19,2000.
[2]Sun Microsystems, Inc. K Virtual Machine (KVM) Specification(KVM Developer Release 4)[P].September 28,1999.
[3]Sun Microsystems, Inc. The CLDC HotSpot Implementation Virtual Machine (White Paper)[P].May 19,2000.
[4]Sun Microsystems, Inc. Connected, Limited Device Configuration(Specification Version 1.0, Java 2 Platform Edition)[P].May 19,2000.
[5]王克宏.Java技术教程(基础篇)[M]. 北京: 清华大学出版社,2005.
[6]耿祥义, 张跃平. Java 2实用教程[M]. 北京: 清华大学出版社,2006.
[7]J2ME MIDP1.0/2.0无线设备编程指南[M]. 北京: 北京大学出版社.
[8]温尚书. J2ME无线通信实用案例教程[M]. 北京: 清华大学出版社, 2003.
[9]李振鹏,龚剑. Java开发利器: J2ME手机游戏开发技术详解[M].北京: 清华大学出版社, 2006.
[10]黄聪明. Java移动通信程序设计—J2MEMIDP[M].北京: 清华大学出版社,2002.
Research and realization of J2ME CLDC platform for the implementation of concurrent multitasking
ZHANG Bo
(Electronic Information Engineering Department,Changsha Normal University,Changsha410100,China)
J2ME brings platform independency inherited from Java language to mobile wireless devices. It enables dynamic and delivery of interactive content and applications to those devices via various network. And it can customize applications according to users,requirement. This paper first gives basic concepts of J2ME platform, then introduces CLDC, depth development and application of the CLDC environment multithreaded. Finally, given solutions were discussed and pointed out its usefulness.
J2ME; CLDC; multi-tasking; multi-threading
TN-9
A
1674-6236(2014)07-0146-04
2013-08-10稿件编号201308071
2013年度湖南省教育厅科学研究项目支持(13C1070)
张 博(1980—),男,湖南长沙人,硕士研究生,讲师。研究方向:图像处理与模式识别、信号处理、计算机信息安全理论。