`
吖龙Sam
  • 浏览: 21004 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

传统定时器使用Timer和TimerTask组合使用

java.util.Timer:定时器,用于指定时间后任务执行一次,或者定期重复执行。

java.util.TimerTask:继承了Runnable类,本质上就是一个Runnable对象

 

Timer和TimerTask定时器主要有两种使用情景:

1)多长时间后,执行一次定时器任务

2)多长时间后,执行一次定时器任务,之后每间隔相同时间执行一次任务

 

一、定时器的使用

package com.sam;

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

/**
 * 传统定时器回顾
 * @author SAM
 *
 */
public class TraditionalTimerTask {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Timer timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			
			@Override
			public void run() {
				System.out.println("定时器 TName=" + Thread.currentThread().getName() + ",bombing!");
			}
		}, 1000L, 3000L);
		
		// 为了观察,打印当前时间
		while (true){
			System.out.println(new Date().toLocaleString());
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 执行结果:

 

2017-5-13 17:23:30

定时器 TName=Timer-0,bombing!

2017-5-13 17:23:32

2017-5-13 17:23:33

2017-5-13 17:23:34

定时器 TName=Timer-0,bombing!

2017-5-13 17:23:35

2017-5-13 17:23:36

2017-5-13 17:23:37

定时器 TName=Timer-0,bombing!

2017-5-13 17:23:38

2017-5-13 17:23:39

2017-5-13 17:23:40

定时器 TName=Timer-0,bombing!

 

可以看到定时器首次1秒后执行,之后每间隔3秒都会重复执行一次定时器任务。

 

二、定时器巩固

需求:2秒后执行一次任务,接着4秒后执行一次任务,然后又回到2秒后执行一次任务,

紧接着4秒又执行一次任务,如此反复,请写出代码。

 

package com.sam;

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

/**
 * 传统定时器回顾
 * 需求:2秒后执行一次任务,接着4秒后执行一次任务,然后又回到2秒后执行一次任务,
 * 紧接着4秒又执行一次任务,如此反复,请写出代码。
 * @author SAM
 *
 */
public class TraditionalTimerTask_2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 2秒后执行定时任务
		new Timer().schedule(new MyTimerTask(), 2000L);
		
		// 为了观察,打印当前时间
		while (true){
			System.out.println(new Date().toLocaleString());
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class MyTimerTask extends TimerTask{

	static int count;
	@Override
	public void run() {
		// 奇数4秒,偶数2秒
		count = ++count % 2;
		System.out.println("定时器 TName=" + Thread.currentThread().getName() + ",bombing!");
		new Timer().schedule(new MyTimerTask(), 2000L + 2000L*count);
	}
}

执行结果:

 

2017-5-13 17:45:52

2017-5-13 17:45:53

定时器 TName=Timer-0,bombing!

2017-5-13 17:45:54

2017-5-13 17:45:55

2017-5-13 17:45:56

2017-5-13 17:45:57

定时器 TName=Timer-1,bombing!

2017-5-13 17:45:58

2017-5-13 17:45:59

定时器 TName=Timer-2,bombing!

2017-5-13 17:46:00

2017-5-13 17:46:01

2017-5-13 17:46:02

2017-5-13 17:46:03

定时器 TName=Timer-3,bombing!

 

接着再深入Timer类一些细节,Timer有两组启动定时器任务的方法,他们可能比较费解:

1)schedule(TimerTask task, long delay, long period) 

2)scheduleAtFixedRate(TimerTask task, long delay, long period) 

 

区别:

他们都可以实现:多长时间后,执行一次定时器任务,之后每间隔相同时间执行一次任务;

但是他们又有一些本质的区别,首先schedule是固定延期执行,而scheduleAtFixedRate是固定速率执行。

 

再具体说:

1)固定延期,根据前一次执行的实际时间来安排每一次执行。

如果由于任何原因(如垃圾回收或者其他后台活动)而延迟了某次执行,则后续执行也将延迟。

 

2)固定速率,根据已安排的初始执行时间来安排每次执行。

如果由于任何原因(如垃圾回收或者其他后台活动)而延迟了某次执行,

则将快速连续执行两次或者更多任务,从而使后续执行能够“追赶上来”。

注意这时TimerTask的执行需要考虑同步。

 

最后推荐一个开源项目,quartz,主要用来实现复杂的调度需求。

例如周一至周五早上10点定时收邮件,周六日不收邮件,

这时使用Timer和TimerTask可能比较复杂,使用quartz开源项目可以很容易的解决这类需求。

 

 

 

 

分享到:
评论

相关推荐

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    python量化交易视频课

    接着,"02_量化交易项目流程、做什么.mp4"将详细介绍一个完整的量化交易项目从开始到结束的流程,包括数据收集、数据清洗、策略设计、回测验证、实盘部署等步骤,让我们了解量化交易的完整生命周期。 "05_策略运行...

    基于状态机的按键扫描程序

    在讨论基于状态机的按键扫描程序之前,我们首先回顾一下常见的按键扫描方法: 1. **死循环扫描方式**:这种扫描方式通常出现在初学者教程或51系列单片机开发板的例子中。其基本原理是在主循环中持续检测按键状态,...

    使用RxJS更优雅地进行定时请求详析

    在传统的JavaScript定时器(`setTimeout`或`setInterval`)中,异步请求可能无法按顺序返回结果,导致在进度条显示等场景中出现问题。而使用`interval`配合RxJS的管道方法,我们可以确保请求的顺序和响应的处理顺序...

    ACE开发指南

    - 提供了丰富的组件和服务,例如线程池、定时器、信号处理、同步机制等。 - **主要内容**:介绍了如何从源码编译ACE,包括在Windows和Linux平台上的具体步骤。 - **获取ACE**:可以从ACE官方网站下载最新版本的源码...

    数字频率计51单片机.doc

    相比于传统的模拟频率计,数字频率计具有更高的精度、更快的响应速度和更宽的测量范围。 1.2 数字频率计的基本原理 数字频率计的基本工作原理是通过检测输入信号的周期,然后计算单位时间内信号的周期数来确定其...

    51单片机超高精度6路舵机控制程序

    传统的舵机控制方法往往依赖于定时器中断来产生周期性的脉冲信号,从而控制舵机的转动角度。然而,为了达到更高的控制精度,我们需要对传统方法进行改进。 #### 二、基础知识回顾 - **51单片机**: 是一种广泛使用...

    电子技术课程设计报告交通灯.doc

    这项设计旨在结合传统设计方法与现代电子设计自动化技术,以数字信号处理为核心,实现交通管理的自动化。 在第一章“课题背景”中,设计背景部分解释了交通信号灯对于维持交通秩序、提高道路通行能力和减少交通事故...

    Java SSM开发大众点评后端

    1回顾Spring MVC的工作流程 2总结Spring MVC的数据绑定 3Spring定时器、拦截器的应用 4跟踪Spring源码,追踪解决问题 前后端分离开发 手把手演示如何串联React技术栈App和管理后台 让后台Form表单提交符合RESTful...

    基于51单片机三角波信号发生器设计论文.doc

    传统的函数信号发生器主要产生正弦波、方波和锯齿波等标准波形,但特殊波形发生器价格较高。 本文档围绕基于51单片机设计的三角波信号发生器展开,该设计旨在产生多种波形,包括三角波、方波和正弦波,并允许用户...

    微机原理和接口 交通灯接口课程设计

    在传统的定时控制方式中,交通灯的红绿灯转换间隔是固定的,这往往会导致道路资源的浪费或交通拥堵。例如,设定东西方向60秒,南北方向40秒的通行时间可能无法适应实时的交通需求。而模糊控制技术虽然可以根据车辆...

    简易百分秒表(可当电子时钟)

    该软件能够显示从0到24小时59分59秒0.99秒的时间范围,这意味着它可以提供比传统秒表更为精细的时间刻度,精确到百分之一秒,极大地满足了对时间精度有高要求的用户。 在秒表功能的设计上,它通常具备以下关键特性...

    windows程序设计

    - **字符集简史**:回顾字符集的发展历程,从ASCII到Unicode的转变。 - **宽字符和C**:探讨宽字符在C语言中的表示方法和使用技巧。 - **宽字符和WINDOWS**:讲解Windows环境下如何支持和处理宽字符。 #### 3. 窗口...

    基于-AT89S51D单片机多功能电子万年历设计.doc

    1. **单片机技术**:AT89S51D是一款基于8051内核的单片机,具备存储器、定时器/计数器、串行通信接口等多种功能,适合用于构建简单的电子系统。 2. **系统设计**:系统设计包括硬件和软件两部分。硬件部分主要涉及...

    初学者--51单片机教程

    这种方法打破了传统单片机教学中先理论后实践的模式,通过一系列具体的实验项目来教授单片机的使用方法,使学习过程更加直观、高效。 - **教程内容**: - **上册**: 主要介绍单片机的基本原理、硬件连接、软件编程等...

    基于PLC控制的抢答器毕业设计完整版样本.doc

    首先,让我们简要回顾一下抢答器的传统形式。传统的抢答器多依赖于机械或电子开关以及计时器,其操作相对简单,但往往伴随一些缺陷。例如,稳定性受硬件质量影响较大,操作过程需要人工干预,而且不太容易调整和修改...

    嵌入式应用程序开发标准教程

    6. **中断和定时器**:阐述中断处理机制,以及如何利用定时器实现周期性任务或实时响应。 7. **电源管理**:讲解如何在嵌入式系统中优化能源消耗,延长电池寿命。 8. **调试技术**:介绍常用的嵌入式调试工具,如...

Global site tag (gtag.js) - Google Analytics