J2ME Timer 使用指南

LT9211 单路mipi转双路mipi芯片,方案成熟,提供技术支持 LT9211 单路mipi转双路mipi芯片 阅读详情
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 处理星空的更新并重绘任务,使得整个星空不断得往屏幕下方“延伸”。这样就生成了一个简单的星空移动的效果。


Obsidian与GPT协作:数学公式从KaTeX到MathJax的无缝转换实践 本文针对Obsidian用户从GPT等AI助手复制数学公式时遇到的KaTeX与MathJax格式不兼容问题,提供了高效的解决方案。重点介绍了KaTeX to MathJax插件的核心作用,它能自动将AI生成的KaTeX格式公式(如\(...\))无缝转换为Obsidian默认支持的MathJax格式($...$),实现复制粘贴后公式即时渲染,极大提升了数学笔记与AI协作的效率和流畅度。 阅读详情

相关推荐

从零开始:使用Verilog在FPGA上实现8051微控制器的完整指南

8051微控制器是一种8位微控制器,由Intel在1980年代初推出。它包括一个CPU、一些RAM和ROM、I/O端口、定时器和串行通信接口。由于其简单的架构和强大的功能,8051已经成为了嵌入式系统设计的首选。FPGA是一种集成电路,设计师可以按照自己的需求进行编程。与传统的ASIC(应用特定集成电路)相比,FPGA提供了更高的灵活性,允许在硬件级别进行快速原型设计和迭代。这里,我们定义了一些基本的输入/输出端口,如时钟clk、复位reset、数据输入/输出和地址输入/输出。

qq_38334677的博客 1315

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

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

aaaaatiger--寻路 953

mapbox进阶,dem数据转为等高面,加载转换后的等高面到地图

本文详细介绍如何基于mapbox-gl v3.*.* 版本,使用dem数据转为等高面,加载转换后的等高面到地图,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 375

J2ME Timer 使用指南

 J2SE 1.3 里有一项新的改进,那就是提供了一个可以更简单的实现多任务调度执行的定时器类,调度由一个后台线程完成。 MIDP 同样也包含了这一改进,使得 J2ME 开发人员从中受益。 J2ME 提示了两个类用来定义和调试任务, 他们分别是 TimerTask 和 TimerTimerTask 是用户定义的需要被调度的所有任务的抽象基类。Timer 类在任务执行的时候负责创建和管理执

丁根的专栏 415

在J2ME中使用TimerTimerTask来实现多线程

众所周知,Java语言在语言的低层就支持多线程,在Java中可以使用两种方式来实现多线程操作,这两种方式依次是: 1、继承Thread类2、实现Runnable接口但是Java语言中还有两个类,可以组合来实现多线程的控制,这两个类就是java.util包中的TimerTimerTask类。和上面的实现方式相比,使用这种方式来实现多线程,可以很方便的开启多个线程,并且代码的结构比较清晰,但

丁根的专栏 602

j2me多线程的实现(timer,timertask)来实现

一    线程的基本实现方法1.Thread继承方法       。定义一个类,继承Thread    如:class PrintThread extend Thread{}       。重写其run()函数         如:public void run(){}       。对象调用start()方法     如: new PrintThread.start();2. Runnable实

370

(转)在J2ME中使用TimerTimerTask来实现多线程

Java语言中还有两个类,可以组合来实现多线程的控制,这两个类就 是java.util包中的TimerTimerTask类。和上面的实现方式相比,使用这种方式来实现多线程,可以很方便的开启多个线程,并且代码的 结构比较清晰,但是创建类的数量比较多,系统开销稍微大一些。下面详细进行一下介绍 在J2ME中使用TimerTimerTask来实现多线程 作者:陈跃峰 出自:http://blog.c...

iteye_11392的博客 178

利用J2ME开发联网程序实例

尽管目前的无线网络不够理想,手机联网还是给我们开发人员不小的震撼的。毕竟这真的是件神奇的事情,不是吗?本文将讲述如何应用J2ME平台中的通用联网框架开发联网的应用程序。 首先,必须说明一点:MIDP中规定,任何移动信息设备都必须提供通过http协议的支持,而像其他的通信方式例如socket是设备相关的。有些手机会支持,有些则不支持。这里只大概的说明一下http协议相关的内容,如

3万+

游戏开发基础(3)

第三章 DirectX SDK简介第一节 关于DirectX SDKMicrosoft DirectX提供了一套非常优秀的应用程序接口,包含了设计高性能、实时应用程序的源代码。DirectX技术将帮助您建构下一代的电脑游戏和多媒体应用程序。它的内容包括了DirectDraw、DirectSound、DirectPlay、Direct3D和DirectInput等部分,它们分别主

3万+

JAVA 编程规范

 1. 应用范围本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JAVABEAN,EJB)均应遵守这个规范。同时,也可作为其它项目的参考。 2. 设计类和方法2.1     创建具有很强内聚力的类方法的重要性往往比类的重要性更容易理解,方法是指执行一个统一函数的一段代码。类常被错误的视为是一个仅仅用于存放方法的容器。有些开发人员甚至

2万+

游戏开发基础(9)

第一节窗口的移动和改变大小时case WM_SIZE:case WM_MOVE:if (IsIconic(hWnd)){    Msg("FoxBear is minimized, pausing");    PauseGame();}if (bFullscreen){    SetRect(&rcWindow, 0, 0, GetSystemMetrics(SM_CXSCRE

2万+

Symbian游戏编程入门 (二)开发环境入门

二.开发环境入门2.1 安装SDK及VCNokia根据手机的屏幕大小和价格高低把手机分成了多个系列,现在使用的系列有:Series 40、Series 60、Series 80 和Series 90。60系列采用Symbian os 6.1,然后又根据手机屏幕的特点对UI做了一些修改,这个被修改了的Symbian就被称为Nokia的60系列平台。使用60系列的手机型号包括:Nokia 66

8540

小团队游戏开发的阶段划分

 目前,开发手机游戏的厂商如同雨后春笋般的冒了出来,有大有小,甚至几个朋友在一起就能攒出一个小公司,进行开发。每个公司,也都有“具备自己特色”的开发过程,好一些的,直接套用传统的软件工程的理论,差一些的,也只能闷头苦干了。我在这里想谈的是对于小团队开发游戏的一种高效的开发方法和阶段划分。       游戏开发的阶段划分,我认为可以划分为5个阶段,叙述如下: 第一阶段:提案 

7167

电脑开机logo修改软件加刷bios工具包支持8_9_10_11_12代主板v3.0

电脑开机logo修改软件加刷bios工具包支持8_9_10_11_12代主板免编程器刷bios软件和改bios logo图片软件合集支持12代电脑,11代电脑,10代电脑,9代电脑,8代电脑主板直接在windows电脑上操作,非常方便。个性化设置电脑开机图案图片logo软件

linux和windows双系统安装(Red Hat Linux 9.0为例)

如今Linux不仅在服务器领域的应用取得较大进展,而且在桌面应用领域也有越来越多的人选择使用。下面就以Red Hat Linux 9.0为例,介绍如何与Windows XP组成双系统。

上一篇: 游戏开发基础(10)
下一篇: 提高JAVA水平从这里开始1--数据结构篇[转来的]
gztoby
博客等级 码龄22年 70粉丝 281原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值