`

Timer

阅读更多
这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求

     Timer类是用来执行任务的类,它接受一个TimerTask做参数

     Timer有两种执行任务的模式,最常用的是schedule,它可以以两种方式执行任务:1:在某个时间(Data),2:在某个固定的时间之后(int delay).这两种方式都可以指定任务执行的频率.看个简单的例子:



import java.io.IOException;
import java.util.Timer;

public class TimerTest ...{
       
    public static void main(String[] args)...{
        Timer timer = new Timer();
        timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.
        while(true)...{//这个是用来停止此任务的,否则就一直循环执行此任务了
            try ...{
                int ch = System.in.read();
                if(ch-'c'==0)...{
                    timer.cancel();//使用这个方法退出任务
                    
                }
            } catch (IOException e) ...{
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    
    static class MyTask extends java.util.TimerTask...{

        @Override
        public void run() ...{
            // TODO Auto-generated method stub
            System.out.println("________");
        }
    }
    
    
    
    
}



    如果你使用的是JDK 5+,还有一个scheduleAtFixedRate模式可以用,在这个模式下,Timer会尽量的让任务在一个固定的频率下运行,举例说明:在上面的例子中,我们想让MyTask在1秒钟后,每两秒钟执行一次,但是因为java不是实时的(其实java实时性很差.....),所以,我们在上个程序中表达的原义并不能够严格执行.如果我们调用的是scheduleAtFixedRate,那么,Timer会尽量让你的Task执行的频率保持在2秒一次.运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,MyTask 执行一次,因为系统繁忙,之后的2.5秒后MyTask 才得以执行第二次,然后,Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么,1.5秒后,MyTask 将执行的三次."以固定的频率而不是固定的延迟时间去执行一个任务"

果然很方便吧^_^



下面给出一个复杂点的例子,其中告诉大家怎么退出单个TimerTask,怎么退出所有Task

package MyTimerTest;

import java.io.IOException;
import java.util.Timer;


/**//*
 * 本类给出了使用Timer和TimerTaske的主要方法,其中包括定制任务,添加任务
 * 退出任务,退出定时器.
 * 因为TimerTask的status域是包级可访问的,所以没有办法在java.util.包外
 * 得到其状态,这对编程造成一些不便 .我们不能判断某个Task的状态了.
 * 
 */

public class TimerTest ...{

    public static void main(String[] args) ...{
        Timer timer = new Timer();
        MyTask myTask1 = new MyTask();
        MyTask myTask2 = new MyTask();
        myTask2.setInfo("myTask-2");
        timer.schedule(myTask1, 1000, 2000);
        timer.scheduleAtFixedRate(myTask2, 2000, 3000);
        while (true) ...{
            try ...{
                byte[] info = new byte[1024];
                int len = System.in.read(info);
                String strInfo = new String(info, 0, len, "GBK");//从控制台读出信息
                if (strInfo.charAt(strInfo.length() - 1) == ' ') ...{
                    strInfo = strInfo.substring(0, strInfo.length() - 2);
                }
                if (strInfo.startsWith("Cancel-1")) ...{
                    myTask1.cancel();//退出单个任务
                    // 其实应该在这里判断myTask2是否也退出了,是的话就应该break.但是因为无法在包外得到
                    // myTask2的状态,所以,这里不能做出是否退出循环的判断.
                } else if (strInfo.startsWith("Cancel-2")) ...{
                    myTask2.cancel();
                } else if (strInfo.startsWith("Cancel-All")) ...{
                    timer.cancel();//退出Timer
                    break;
                } else ...{
                    // 只对myTask1作出判断,偷个懒^_^
                    myTask1.setInfo(strInfo);
                }
            } catch (IOException e) ...{
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    static class MyTask extends java.util.TimerTask ...{
        String info = "^_^";

        @Override
        public void run() ...{
            // TODO Auto-generated method stub
            System.out.println(info);
        }

        public String getInfo() ...{
            return info;
        }

        public void setInfo(String info) ...{
            this.info = info;
        }

    }

}

 

 

 

 

package Timer;

import java.util.Timer;
import java.util.TimerTask;

public class Test {
    public static void main(String[] args) throws Exception {
        Timer timer = new Timer(false);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                System.out.println(System.currentTimeMillis());
            }
        }, 1000, 2000);

        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                System.out.println(System.currentTimeMillis() + "---");
            }
        }, 1000, 2000);
        timer.schedule(new TimerTask() {

            @Override
            public void run() {
                System.out.println(System.currentTimeMillis() + "--222222222222-");
            }
        }, 1000);//只执行一次
        // Thread.sleep(5000);
        // timer.cancel();
    }
}

 

这个把一些线程的任务包装了,但在线程互斥的场合用起来还有问题,没研究他内部怎么锁的

分享到:
评论
1 楼 zhangyou1010 2011-01-11  
谢谢分享,看了你的文章对Timer这个类理解了更深了,比看API管用。

相关推荐

    C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③...

    Timer_基于Verilog的timer计时器_

    **基于Verilog的Timer计时器详解** 在数字系统设计中,Timer是一个至关重要的模块,它用于实现定时或延时功能。在这个项目中,我们关注的是一个基于Verilog硬件描述语言实现的Timer计时器。Verilog是一种广泛使用的...

    02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序.rar

    这个"02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序.rar"压缩包包含了一系列针对STC8A8K芯片上所有定时器的测试程序,这些程序对于理解和应用这些定时器功能至关重要。 STC8A8K系列单片机提供了多个定时器,包括...

    加Timer控件 timer1

    ### Timer 控件在C#中的应用 #### 一、Timer 控件简介 在C#的Windows Forms应用程序开发中,`System.Windows.Forms.Timer`(通常简称为Timer)是一种非常实用的控件,它能够周期性地执行某个方法或事件处理程序。...

    timer_hw.rar_hw_timer

    在IT行业中,硬件定时器(HW Timer)是嵌入式系统和计算机硬件中不可或缺的组件。硬件定时器通常由微控制器或系统级芯片(SoC)中的专用硬件电路实现,用于执行时间相关的任务,如中断服务、周期性操作或者精确计时...

    4 Timer0定时器中断_TIMER0_c8051f340_

    本文将深入探讨C8051F340中的TIMER0定时器中断,以及如何利用它实现所需的系统功能。 TIMER0是C8051F340内部的一种硬件定时器资源,常用于时间间隔的测量、脉冲宽度调制(PWM)生成、波特率发生器等多种应用。它...

    C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-22

    C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4...

    单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)

    单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制条形LED(有源码)单片机C语言程序设计 TIMER0与TIMER1控制...

    C#定时器(Timer)

    C#定时器(Timer)是.NET框架中一个非常重要的组件,它允许开发者在特定的时间间隔内执行特定的代码块,从而实现周期性的任务。在Windows应用程序、服务或控制台程序中,C#定时器常常被用来创建后台任务、监控、更新...

    MsTimer2.rar

    MsTimer2是一个专门为Arduino平台设计的高级定时器库,它扩展了Arduino的定时功能,提供了比内置`millis()`和`delay()`函数更精确、更灵活的定时解决方案。这个库特别适合那些需要高精度定时任务或者同时管理多个...

    最新单片机仿真 TIMER0与TIMER1控制条形LED

    最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED...

    系统Timer机制,从硬件到操作系统,还有Qemu对timer的模拟

    本文将深入探讨Timer的各个层面,包括Timer机制、硬件Timer、操作系统中的Timer、应用程序中的Timer以及在QEMU中的Timer模拟。 1. Timer Mechanism Timer机制是计算机系统中用于定时和计时的基础结构。它通常由多层...

    5 Timer2定时器中断_c8051f340_TIMER2定时器中断_

    在这款芯片中,TIMER2是一个重要的定时/计数器资源,它提供了中断功能,使得开发者能够实现基于时间的事件处理和精确的时序控制。下面我们将详细探讨TIMER2定时器中断的相关知识点。 1. TIMER2结构与功能: TIMER2...

    多个 timer 使用示例

    标题 "多个 timer 使用示例" 暗示我们即将探讨的是如何在编程环境中,特别是使用 Progress 4GL(通常简称为 PB,即 PowerBuilder)语言,有效地管理并使用多个计时器(timer)对象。Progress 4GL 是一种面向对象的...

    cmsdk_apb_timer_M3verilog_SOC_apb_timer_apbverilog_CMSDK_

    标题 "cmsdk_apb_timer_M3verilog_SOC_apb_timer_apbverilog_CMSDK_" 暗示了这是一个基于Verilog语言设计的定时器模块,适用于ARM Cortex-M3架构的系统级芯片(SoC)设计。CMSDK可能指的是Core Micro-System Design ...

    arm generic timer prelim data

    根据提供的文档信息,我们可以深入探讨ARM Generic Timer的相关知识点。标题和描述均提到“ARM Generic Timer Prelim Data”,这意味着文档提供的是关于ARM通用定时器的一些初步数据和技术规范。下面将详细介绍ARM ...

    異步Timer Timer

    在这个场景中,"異步Timer Timer"的标题和描述提到了时间管理和异步处理事件的概念,这通常与编程语言中的定时器控件有关。我们将深入探讨异步编程、VB(Visual Basic)中的Timer控件以及它们如何协同工作。 首先,...

    dw_apb_timer_of.rar_V2 _apb timer_dw_apb_dw_timer_pc3x2

    【标题】"dw_apb_timer_of.rar_V2_apb timer_dw_apb_dw_timer_pc3x2" 提供的是一款基于Linux内核v2.13.6的APB定时器驱动程序,它主要关注DW_APB(DesignWare APB)定时器的实现。DW_APB定时器是一种常见的数字信号...

    pb多timer事件实例.zip

    4. **区分TIMER**:在Timer事件处理程序中,通过TIMER对象的Handle属性或自定义的ID属性来判断是哪个TIMER触发了事件,然后执行相应的操作。 例如,如果窗口中有两个TIMER(TIMER1和TIMER2),并且都绑定了Timer...

Global site tag (gtag.js) - Google Analytics