J2ME Timer 使用指南

J2SE 1.3 里有一项新的改进,那就是提供了一个可以更简单的实现多任务调度执行的定时器类,调度由一个后台线程完成。 MIDP 同样也包含了这一改进,使得 J2ME 开发人员从中受益。

J2ME 提示了两个类用来定义和调试任务, 他们分别是 TimerTask 和 Timer。TimerTask 是用户定义的需要被调度的所有任务的抽象基类。Timer 类在任务执行的时候负责创建和管理执行线程。

要定义一个任务,定义一个 TimerTask 的子类,并实现 run 方法。例如

import java.util.*;

public class MyTask extends TimerTask
{
public void run()
{
System.out.println( "Running the task" );
}
}

是不是觉得 run 方法很熟悉呢?那是因为 TimerTask 实现了 java.lang.Runnable 接口。 Timer 类调用这个 run 方法来执行各个任务。此外还有一点必须注意到,那就是每个 run 方法所执行的任务必须能够尽快的终止,因为每个 Timer 对象在同一时间只能执行一个任务。

定义好一个任务以后,你可以生成一个 Timer 对象并调用 schedule 方法来调度它,就像下面的代码演示的那样:

import java.util.*;

Timer timer = new Timer();
TimerTask task = new MyTask();

// 在执行这个任务前等待十秒...
timer.schedule( task, 10000 );

// 在执行任务前等待十秒,然后每过十秒再执行一次
timer.schedule( task, 5000, 10000 );

schedule 方法被重载了四次;每一个任务都可以在一个特定的时间点(使用一个 Date 对象指定)或者延时特定的时间段(以毫秒为单位)之后执行。你可以安排这个任务只执行一次或者在一段特定的时间段里反复执行。Timer 还提供了一个 scheduleAtFixedRate 方法来根据该任务第一次执行的时间来指定反复执行时延长的时间段。如果一个任务被延时了,被安排在后面执行的任务就被相应的缩短等待时间以“接上”被延时的任务。

每个 Timer 对象都会创建和管理一个后台线程。一般情况下,一个程序创建一个 Timer 就够了,当然也可以根据需要创建任意多个。你还可以在任何时候停止一个 Timer 并终止后台线程,方法是调用 cancel 方法。但要注意的是,一旦 Timer 并终止了,就不可能再恢复执行,除非你重新生成一个 Timer 对象并重新安排你想要执行的任务。Timer 对象是线程安全的,你可以在多线程的环境下直接访问 Timer 对象,而不用任何显式的同步处理。

另外,每个任务提供了一个 cancel 方法(继承自 TimerTask 基类),你可以在任务执行的过程当中调用该方法来终止该任务。一旦你终止了该任务,那么它将退出任务调度。你可以在任何时间调用每个任务的 cancel 方法来终止该任务的执行,哪怕该任务还一次都没有执行过。

下面提供了一个简示的 MIDlet 示例来演示 Timer 的使用,我们将利用定时器来模拟一个星空移动的效果。星星用一个点来表示,这使用到了低界图形 API。关于低界图形 API 更详细的介绍,请参考我的另一篇文章《使用 MIDP 的低界用户界面 API》。

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class TimerDemo extends MIDlet {

Display display;
StarField field = new StarField();
FieldMover mover = new FieldMover();
Timer timer = new Timer();

public TimerDemo() {
display = Display.getDisplay( this );
}

protected void destroyApp( boolean unconditional ) {
}

protected void startApp() {
display.setCurrent( field );
timer.schedule( mover, 100, 100 );
}

protected void pauseApp() {
}

public void exit(){
timer.cancel(); // stop scrolling
destroyApp( true );
notifyDestroyed();
}

class FieldMover extends TimerTask {
public void run(){
field.scroll();
}
}

class StarField extends Canvas {
int height;
int width;
int[] stars;
Random generator = new Random();
boolean painting = false;

public StarField(){
height = getHeight();
width = getWidth();
stars = new int[ height ];

for( int i = 0; i < height; ++i ){
stars[i] = -1;
}
}

public void scroll() {
if( painting ) return;

for( int i = height-1; i > 0; --i ){
stars[i] = stars[i-1];
}

stars[0] = ( generator.nextInt() %
( 3 * width ) ) / 2;
if( stars[0] >= width ){
stars[0] = -1;
}

repaint();
}

protected void paint( Graphics g ){
painting = true;

g.setColor( 0, 0, 0 );
g.fillRect( 0, 0, width, height );

g.setColor( 255, 255, 255 );

for( int y = 0; y < height; ++y ){
int x = stars[y];
if( x == -1 ) continue;

g.drawline( x, y, x, y );
}

painting = false;
}

protected void keypressed( int keycode ){
exit();
}
}
}

TimerDemo MIDlet 使用了一个 Timer 对象 timer 来调度执行一个 TimerTask 任务 FieldMover,时间间隙 100 毫秒。FieldMover 处理星空的更新并重绘任务,使得整个星空不断得往屏幕下方“延伸”。这样就生成了一个简单的星空移动的效果。

时间: 2024-12-25 02:34:46

J2ME Timer 使用指南的相关文章

J2ME中文教程之J2ME技术概述

教程|中文 随着移动通信的突飞猛进,移动开发这个新鲜的字眼慢慢成为开发者关注的热点.在网上进行的最近一份调查显示,有24.34%的受访者涉足嵌入式/移动设备应用开发,这个数字可能略高于实际的比例,但也足可说明嵌入式/移动设备应用开发是一块诱人的新鲜奶酪.J2ME(Java 2 Micro Edition)是嵌入式/移动应用平台的王者,Linux和WinCE分列二.三位.Nokia等厂商力推的Symbian平台目前开发者占有率尚未达到满意水平,考虑到调查项合并了嵌入式设备(例如PDA)和移动设备(

J2ME游戏开发中时钟的简单实现

时钟 在游戏开发中,有时候我们需要一个时钟来记录游戏的时间,如果时间结束则结束游戏.本文介绍如何在J2ME中使用Timer和TimerTask来实现这样一个时钟,并给出具体代码实例. 在java.util包中有一个TimerTask类,你可以扩展这个类并且实现他的run()方法,在run()方法中编写我们的逻辑代码.如果我们想制作一个游戏时钟,那么非常简单我们编写一个GameClock类扩展TimerTask,GameClock需要维持一个实例变量timeLeft,这样我们就可以记录游戏剩余的时

J2ME中多线程网络连接编程的分析

编程|多线程|网络 摘 要 介绍并分析了J2ME的通用网络连接框架(GCF),并以此为基础,指出了在J2ME网络连接编程中存在的问题,并提出了通过构建多线程的两种解决方法. 关键词 J2ME GCF多线程 网络连接 引言 J2ME(Java 2 Micro Edition)是Java 2的一个组成部分,它与J2SE.J2EE并称.J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话.可视电话.数字机顶盒和汽车导航系统等等.即J2ME是为消费电子产品和手持设备量身定制的

J2ME Wireless Toolkit 2.2 新改进

屡获殊荣的 J2ME Wireless Toolkit 已经成为 J2ME 开发应用程序的事实标准工具包.自从 2000 年初次亮相以来,该工具包一直在发展以赶上移动 Java 技术外观上快速改变的步伐.不要被从 2.1 版本以来的小改变所误导.新的工具包在四个重要的领域支持 Java Community Process (JCP) 所指定的新的可选 API:3D 图形.多媒体通信.蓝牙连网(Bluetooth networking)和数据管理.本文将描述这些新的 API 并且向您展示如何在工具

J2ME:定时器(TimerTask)使用及初探

最近完成个J2ME游戏,一直以来总想写点东西给大家~因为以前总是在索取,现在把J2ME的入门知识-定时器的相关知识以及我的一点体会-付出给大家,内容不多只是它的使用,希望对入门的J2ME开发者有所帮助. 首先,说下定时器的基本使用,以下内容摘自NOKIA 论坛里的一篇文章: <为60系列平台设计Java应用>--定时器 各种定时器让各种应用能方便地规划任务,而不必对线程进行调配.使用线程通常需要更为复杂的设计,并需要更多的系统资源,对各种小设备而言,比较奢侈. 创建一个定时器的范例: publ

J2ME中程序优化的十个小方法

j2me程序由于其特殊的运行环境限制,所以优化就显得比较重要,以下是在学习j2me编程所收集的一些技巧和自己的心得. 本文主要是说明j2me平台上的特殊优化方法,与j2se重复的一些技巧就不再赘述了. 1.显示图象时确定好你的fps,最好先做几次小实验,这样能让你在显示效果和运行速度上有比较好的平衡. 2.GamaCanvas.getGraphics()每次都会产生一个全新的对象,但是对这些对象的操作都是对同一个graphics,所以还是只取一次供后面使用. 3.让多个对象使用同样的监听器,比如

《ELK Stack权威指南 》第2章 插件配置

本节书摘来自华章出版社<ELK Stack权威指南 >一书中的第1章,第2节,作者饶琛琳,更多章节内容可以访问"华章计算机"公众号查看. 插 件 配 置 插件是Logstash最大的特色.各种不同的插件源源不断地被创造出来,发布到社区中供大家使用.本章会按照插件的类别,对一般场景下的一些常用插件做详细的配置和用例介绍.本章介绍的插件包括:1)输入插件.基于shipper端场景,主要介绍STDIN.TCP.File等插件.2)编解码插件.编解码通常是会被遗忘的环节,但是运用好

创建和发布 Android 开发库的终极指南

相关术语介绍 在我们开始之前,还有一些术语,需要熟悉下. 项目Project  –  在 Android Studio 中,一个 项目 就是一个完整的 Android app.Android Studio 项目包含了一个或多个模块. 在 Android Studio 中,一个 项目 类似于在 Eclipse 的一个工作区间workspace. 模块Module – 一个 模块 是 app 中的一个组件,它可以单独的进行构建.测试和调试.模块包含了 app 的源代码和资源文件.在 Android

《CCNP安全Secure 642-637认证考试指南》——6.3节为Cisco Catalyst交换机配置认证方

6.3 为Cisco Catalyst交换机配置认证方 CCNP安全Secure 642-637认证考试指南 为交换机配置认证方时,管理员需要完成以下工作. 关键 任务1 配置RADIUS服务器参数. 任务2 配置AAA服务与RADIUS协议. 任务3 全局启用802.1X. 任务4 在指定的访问端口启用802.1X. 任务5 配置定期重认证(可选). 任务6 调整定时器和阈值(可选). 任务7 配置访客策略与认证失败策略(可选). 6.3.1 配置选择 配置认证方时,管理员需要考虑以下问题.