Timer和TimeTask简介

Timer和TimeTask简介

Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

import
java
.
util
.
TimerTask
;

public

class

MyTask

extends

TimerTask

{

private

int

id
;

public

MyTask
(
int

id
)

{

this
.
id

=

id
;

}

public

void

run
(
)

{

System
.
out
.
println
(
"线程"

+

id

+

":正在执行"
)
;

//System.gc();

}

}

然后主程序代码为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import
java
.
util
.
Date
;

import
java
.
util
.
Timer
;

public

class

Test

{

public

static

void

main
(
String
[
]

args
)

{

Timer
timer

=

new

Timer
(
)
;

timer
.
schedule
(
new

MyTask
(
1
)
,

5000
)
;
// 5秒后启动任务

MyTask
secondTask

=

new

MyTask
(
2
)
;

timer
.
schedule
(
secondTask
,

1000
,

3000
)
;

// 1秒后启动任务,以后每隔3秒执行一次线程

Date
date

=

new

Date
(
)
;

timer
.
schedule
(
new

MyTask
(
3
)
,

new

Date
(
date
.
getTime
(
)

+

1000
)
)
;

//      以date为参数,指定某个时间点执行线程

//      timer.cancel();

//      secondTask.cancel();

System
.
out
.
println
(
"main thread 结束!"
)
;

}

}

Timer里面有4个schedule重载函数,而且还有两个scheduleAtFixedRate:
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
安排指定的任务在指定的时间开始进行重复的固定速率执行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
使用scheduleAtFixedRate的话,Timer会尽量的让任务在一个固定的频率下运行。例如:在上面的例子中,让secondTask在1秒钟后,每3秒钟执行一次,但是因为java不是实时的,所以,我们在上个程序中表达的原义并不能够严格执行,例如有时可能资源调度紧张4秒以后才执行下一次,有时候又3.5秒执行。如果我们调用的是scheduleAtFixedRate,那么Timer会尽量让你的secondTask执行的频率保持在3秒一次。运行上面的程序,假设使用的是scheduleAtFixedRate,那么下面的场景就是可能的:1秒钟后,secondTask执行一次,因为系统繁忙,之后的3.5秒后secondTask才得以执行第二次,然后Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么2.5秒后,secondTask将执行的三次。“以固定的频率而不是固定的延迟时间去执行一个任务”就是这个意思。
Timer终止的问题:
默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。可以通过以下3种方法终止一个timer线程:
(1)调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里;
(2)让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行;
(3)调用System.exit方法,使整个程序(所有线程)终止。
TimerTask也有cancel方法。
上面所说的“只要一个程序的timer线程在运行,那么这个程序就会保持运行”。那么反过来,如果Timer里的所有TimerTask都执行完了,整个程序会退出吗,经测试是否定的,例如上面的测试代码,如果只加第一个TimerTask在Timer中执行:
timer.schedule(new MyTask(1), 5000);// 5秒后启动任务
那么5秒以后,其实整个程序还是没有退出,Timer会等待垃圾回收的时候被回收掉然后程序会得以退出,但是多长时间呢?在TimerTask的run函数执行完以后加上System.gc();就可以了。

Java定时调度 Timer类和TimerTask类

Timer类是一种线程设施,可以用来实现某一个时间或某一段时间后安排某一个任务执行一次或定期重复执行。该功能和TimerTask配合使用。TimerTask类用于实现由Timer安排的一次或重复执行的某个任务。每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则会延迟后续的任务执行。 
  Timer类方法摘要

Java代码  

  1. void cancel()
  2. 终止此计时器,丢弃所有当前已安排的任务。
  3. int purge()
  4. 从此计时器的任务队列中移除所有已取消的任务。
  5. void schedule(TimerTask task, Date time)
  6. 安排在指定的时间执行指定的任务。
  7. void schedule(TimerTask task, Date firstTime, long period)
  8. 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
  9. void schedule(TimerTask task, long delay)
  10. 安排在指定延迟后执行指定的任务。
  11. void schedule(TimerTask task, long delay, long period)
  12. 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
  13. void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
  14. 安排指定的任务在指定的时间开始进行重复的固定速率执行。
  15. void scheduleAtFixedRate(TimerTask task, long delay, long period)
  16. 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。

TimerTask类方法摘要

Java代码

  1. boolean cancel()
  2. 取消此计时器任务。
  3. abstract  void run()
  4. 此计时器任务要执行的操作。
  5. long scheduledExecutionTime()
  6. 返回此任务最近实际 执行的已安排 执行时间。

TimerTask类是个抽象类,如果要用该类,需要自己建立一个类来继承此类,并实现其中的抽象方法。

Java代码  package zzs.time.demo;

  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. import java.util.TimerTask;
  4. public class MyTask extends TimerTask {
  5. @Override
  6. public void run() {
  7. // TODO Auto-generated method stub
  8. SimpleDateFormat simpleDateFormat=null;
  9. simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
  10. System.out.println("当前的系统时间为:"+simpleDateFormat.format(new Date()));
  11. }
  12. }

Java代码  

  1. package zzs.time.demo;
  2. import java.util.Timer;
  3. public class TestTask {
  4. /**
  5. * @param args
  6. * @throws InterruptedException
  7. */
  8. public static void main(String[] args) throws InterruptedException {
  9. // TODO Auto-generated method stub
  10. Timer  timer=new Timer();
  11. MyTask myTask=new MyTask();
  12. timer.schedule(myTask, 1000, 2000);
  13. // Thread.sleep(5000);
  14. //timer.cancel();
  15. }
  16. }

运行结果:

Java代码  

  1. 当前的系统时间为:2011-07-10 15:37:44:831
  2. 当前的系统时间为:2011-07-10 15:37:46:786
  3. 当前的系统时间为:2011-07-10 15:37:48:786
  4. 当前的系统时间为:2011-07-10 15:37:50:786
  5. 当前的系统时间为:2011-07-10 15:37:52:786
  6. 当前的系统时间为:2011-07-10 15:37:54:786
时间: 2024-10-29 21:41:31

Timer和TimeTask简介的相关文章

Boost--时间和日期--(1)timer库的介绍

(一)timer库的简介 timer是一个很小的库,提供简单的时间度量和进度显示功能,也可用于性能测试等计时任务.timer库包含三个组件:计时器类timer.progress_timer和进度指示类progress_display. (二)timer类 timer类可以测量时间的流逝,是一个小型的计时器,提供毫秒级别的计时精度和操作函数.它位于boost命名空间下.使用时需要包含头文件: include <boost/timer.hpp> (1)timer的使用 #include <b

【java】java面向对象

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************ 类的定义 (1)类的成员变量的定义 (2)当一个类的定义存在后,可以使用new运算创建对象,类的实例化 new 类名(); JVM

Android学习之界面篇(九)SurfaceView简单学习

知识点: surfaceview介绍 surfaceview与View的区别,surface与surfaceview的区别 实例创建与使用 SurfaceHolder.Callback的使用,surfaceHolder可以看作是surfaceview的控制器,控制图形的大小,像素等. 在主函数中回调函数的使用getHolder.addCallback(this) canvas的锁定与解锁,绘制图形之前锁定画布,绘制结束之后解锁画布. canvas的save与restore, canvas画布的各

【转载】Java定时器的学习

前几看了一下<thinking in java>了解到java原生的Times类有两个问题: (1)Timer是启动单个线程来处理所有的时间任务,如果一个任务耗时很久,那么如果在执行这个过程中,下个定时任务开始,就会对接下来的任务造成影响: (2)Timer某一个定时程序在执行过程中抛出运行时异常,那么定时器就会以为终止定时器的运行: 首先了解一下Timer类的核心组成 Timer有两个核心的属性,一个是TaskQueue对象,用于存储任务队列,一个是TimerThread,用于执行队列中的任

java日期操作大全

摘自(http://www.blogjava.net/i369/articles/83483.html) java日期操作 大全 先来一个:  取得指定月份的第一天与取得指定月份的最后一天  http://iamin.blogdriver.com/iamin/847990.html /**           *  取得指定月份的第一天           *           *  @param  strdate  String           *  @return  String   

日期操作(转载)

2017-03-15 java日期操作 大全先来一个: 取得指定月份的第一天与取得指定月份的最后一天 http://iamin.blogdriver.com/iamin/847990.html /** * 取得指定月份的第一天 * * @param strdate String * @return String */ public String getMonthBegin(String strdate) { java.util.Date date = parseFormatDate(strdat

Android视频播放-SurfaceView和Mediaplayer

好几天没写博客了,处理了一点个人私事加上平时加班,基本上时间不充裕,上篇文章讲了一下用Mediaplayer来播放音乐,这次就讲讲使用Mediaplayer来和SurfaceView配合播放一个视频流媒体.MediaPlayer不仅可以播放视频,还可以与SurfaceView的配合,SurfaceView主要用于显示MediaPlayer播放的视频流媒体的画面渲染,两者可以一起协同播放视频. 基础维护 先来看下要实现的界面: 如果你看过上篇文章,就发现其实很简单的就是多了一个进度条,还有一个就是

11.11-全栈Java笔记:线程状态转换和任务定时调度

线程状态转换 1)New :创建好线程对象,但没有启动的时候. 一个线程调用start()之后不一定会马上启动,此时进入就绪状态,等待得到资源. 2)就绪线程序通过Scheduler(调度程序)去确定是否运行. 3)Runing---dead:运行结束(非双向,为单向箭头). 4)Runing---就绪:暂停(除了没有CPU,具备运行的所有条件). 5)Runing-otherwise(阻塞):因程序原因:调用sleep或join之后,线程被阻塞.这时不具备运行的条件,此时线程进入阻塞池.sle

Android_Timer与Runnable两种方法的定时器

先理清概念: Timer是一个执行任务的类,他接受TimerTask的参数; Timer执行任务有两种方式,一种是在某个指定的时候执行某个任务timer.schedule(Timertask task,Data data),另一种是在多长时间之后执行某个任务timer.schedule(TimerTask task,long delay): TimerTask中执行指定的任务,但由于Android是线程安全的,所有的界面的更新都必须放到主线程中,所以要使用到Handler对象. Android的