这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求
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();
}
}
这个把一些线程的任务包装了,但在线程互斥的场合用起来还有问题,没研究他内部怎么锁的
分享到:
相关推荐
本文实例讲述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享给大家供大家参考。具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③...
**基于Verilog的Timer计时器详解** 在数字系统设计中,Timer是一个至关重要的模块,它用于实现定时或延时功能。在这个项目中,我们关注的是一个基于Verilog硬件描述语言实现的Timer计时器。Verilog是一种广泛使用的...
这个"02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序.rar"压缩包包含了一系列针对STC8A8K芯片上所有定时器的测试程序,这些程序对于理解和应用这些定时器功能至关重要。 STC8A8K系列单片机提供了多个定时器,包括...
### Timer 控件在C#中的应用 #### 一、Timer 控件简介 在C#的Windows Forms应用程序开发中,`System.Windows.Forms.Timer`(通常简称为Timer)是一种非常实用的控件,它能够周期性地执行某个方法或事件处理程序。...
在IT行业中,硬件定时器(HW Timer)是嵌入式系统和计算机硬件中不可或缺的组件。硬件定时器通常由微控制器或系统级芯片(SoC)中的专用硬件电路实现,用于执行时间相关的任务,如中断服务、周期性操作或者精确计时...
本文将深入探讨C8051F340中的TIMER0定时器中断,以及如何利用它实现所需的系统功能。 TIMER0是C8051F340内部的一种硬件定时器资源,常用于时间间隔的测量、脉冲宽度调制(PWM)生成、波特率发生器等多种应用。它...
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控制...
C#定时器(Timer)是.NET框架中一个非常重要的组件,它允许开发者在特定的时间间隔内执行特定的代码块,从而实现周期性的任务。在Windows应用程序、服务或控制台程序中,C#定时器常常被用来创建后台任务、监控、更新...
MsTimer2是一个专门为Arduino平台设计的高级定时器库,它扩展了Arduino的定时功能,提供了比内置`millis()`和`delay()`函数更精确、更灵活的定时解决方案。这个库特别适合那些需要高精度定时任务或者同时管理多个...
最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED最新单片机仿真 TIMER0与TIMER1控制条形LED...
本文将深入探讨Timer的各个层面,包括Timer机制、硬件Timer、操作系统中的Timer、应用程序中的Timer以及在QEMU中的Timer模拟。 1. Timer Mechanism Timer机制是计算机系统中用于定时和计时的基础结构。它通常由多层...
在这款芯片中,TIMER2是一个重要的定时/计数器资源,它提供了中断功能,使得开发者能够实现基于时间的事件处理和精确的时序控制。下面我们将详细探讨TIMER2定时器中断的相关知识点。 1. TIMER2结构与功能: TIMER2...
标题 "多个 timer 使用示例" 暗示我们即将探讨的是如何在编程环境中,特别是使用 Progress 4GL(通常简称为 PB,即 PowerBuilder)语言,有效地管理并使用多个计时器(timer)对象。Progress 4GL 是一种面向对象的...
标题 "cmsdk_apb_timer_M3verilog_SOC_apb_timer_apbverilog_CMSDK_" 暗示了这是一个基于Verilog语言设计的定时器模块,适用于ARM Cortex-M3架构的系统级芯片(SoC)设计。CMSDK可能指的是Core Micro-System Design ...
根据提供的文档信息,我们可以深入探讨ARM Generic Timer的相关知识点。标题和描述均提到“ARM Generic Timer Prelim Data”,这意味着文档提供的是关于ARM通用定时器的一些初步数据和技术规范。下面将详细介绍ARM ...
在这个场景中,"異步Timer Timer"的标题和描述提到了时间管理和异步处理事件的概念,这通常与编程语言中的定时器控件有关。我们将深入探讨异步编程、VB(Visual Basic)中的Timer控件以及它们如何协同工作。 首先,...
【标题】"dw_apb_timer_of.rar_V2_apb timer_dw_apb_dw_timer_pc3x2" 提供的是一款基于Linux内核v2.13.6的APB定时器驱动程序,它主要关注DW_APB(DesignWare APB)定时器的实现。DW_APB定时器是一种常见的数字信号...
4. **区分TIMER**:在Timer事件处理程序中,通过TIMER对象的Handle属性或自定义的ID属性来判断是哪个TIMER触发了事件,然后执行相应的操作。 例如,如果窗口中有两个TIMER(TIMER1和TIMER2),并且都绑定了Timer...