王朝网络
分享
 
 
 

J2ME Timer - 更简单的实现多任务调度执行

王朝java/jsp·作者佚名  2008-05-31
宽屏版  字体: |||超大  

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 {

Displaydisplay;

StarFieldfield = new StarField();

FieldMover mover = new FieldMover();

Timertimer = 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 {

intheight;

intwidth;

int[]stars;

Random generator = new Random();

booleanpainting = 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 处理星空的更新并重绘任务,使得整个星空不断得往屏幕下方“延伸”。这样就生成了一个简单的星空移动的效果。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有