`
吖龙Sam
  • 浏览: 20885 次
  • 性别: 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 数字频率计的基本原理 数字频率计的基本工作原理是通过检测输入信号的周期,然后计算单位时间内信号的周期数来确定其...

    电子技术课程设计报告交通灯.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单片机教程

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

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

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

Global site tag (gtag.js) - Google Analytics