Java线程——特殊线程TimerTask定时器

来源:互联网 发布:青岛黄岛淘宝招聘网 编辑:程序博客网 时间:2024/06/07 01:43

TimerTask是一种特殊的线程,用来为Timer安排一次执行或重复执行的任务。它实现了Runnable接口,是一个抽象类:

/** * A task that can be scheduled for one-time or repeated execution by a Timer. * * @author  Josh Bloch * @see     Timer * @since   1.3 */public abstract class TimerTask implements Runnable{...}

它本身没有实现run()函数,因此需要子类来实现它。所以有了以下的实现方式:

import java.util.Date;import java.util.Timer;import java.util.TimerTask;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TestTimerTask extends TimerTask {    @Override    public void run() {        System.out.println(new Date());    }    public static void main(String[] args) throws InterruptedException {        Timer timer = new Timer();        //TimerTask        TestTimerTask TTT = new TestTimerTask();        //timer.schedule(TTT, 1000, 1000);        timer.schedule(TTT, new Date(), 1000);        Thread.sleep(8000L);        timer.cancel();        //创建线程池        ExecutorService es=Executors.newCachedThreadPool();    }}

定时器任务与线程不同,它是定时执行的线程,因此不能够直接使用start()来启动它,而需要使用一个特殊的类Timer来启动它。Timer是一种工具,用来安排在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

与每个Timer对象相对应的是单个后台线程,用于顺序地执行所有计时器任务.计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。

对Timer对象最后的引用完成后,并且所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。在默认情况下,任
务执行线程并不作为守护线程来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的cancel方法。

public void cancel() {      ...    }

如果意外终止了计时器的任务执行线程,例如调用了它的stop方法,那么所有以后对该计时器安排任务的尝试都将导致IllegalStateException,就好像调用了计时器的cancel方法一样。

此类是线程安全的:多个线程可以共享单个Timer对象而无须进行外部同步。此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部中,它使用二进制堆来表示其任务队列,所以安排任务的开销是O(logn),其中n是同时安排的任务数。

Timer运行定时器的方式有如下几种。
1、安排在指定的时间执行指定的任务:

 public void schedule(TimerTask task, Date time)

2、安排指定的任务在指定的时间开始进行重复的固定延迟执行:

public void schedule(TimerTask task, Date firstTime, long period)

3、安排在指定延迟后执行指定的任务:

public void schedule(TimerTask task, long delay) 

4、安排指定的任务从指定的延迟后开始进行重复的固定延迟执行:

public void schedule(TimerTask task, long delay, long period)

5、安排指定的任务在指定的时间开始进行重复的固定速率执行:

 public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)

6、安排指定的任务在指定的延迟后开始进行重复的固定速率执行:

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

例如,我们可以使用下例循环执行定时器任务,执行的间隔为1000ms:

Timer timer = new Timer();TestTimerTask TTT = new TestTimerTask();timer.schedule(TTT, 1000, 1000);

其中的第一个参数1000表示延迟执行的时间,第二个参数表示循环执行的时间,单位均为毫秒(ms)。这样,在系统启动1000ms后才会执行定时器任务,并且每过1000ms都会继续重新执行该任务。程序运行的结果为:

Tue Dec 26 09:53:51 CST 2017Tue Dec 26 09:53:52 CST 2017Tue Dec 26 09:53:53 CST 2017Tue Dec 26 09:53:54 CST 2017Tue Dec 26 09:53:55 CST 2017Tue Dec 26 09:53:56 CST 2017Tue Dec 26 09:53:57 CST 2017Tue Dec 26 09:53:58 CST 2017Tue Dec 26 09:53:59 CST 2017
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我想考个大专文凭 快速拿到本科文凭 怎么报考本科文凭 网络教育大专文凭有用吗 怎么快速拿到文凭 快速获得大专文凭 如何考取大专文凭 电大属于什么文凭 如何拿到本科文凭 成人大专学历文凭 怎样获得本科文凭 如何获得大专文凭 怎样报考大专文凭 快速拿到大专文凭 怎样拿到大专文凭 成人高考大专文凭 大学毕业是什么文凭 如何快速拿到大专文凭 怎么快速拿到大专文凭 单位承认不承认网络教育文凭 文利 班级文化 文化 文化自信 文化苦旅 文化遗产 茶文化 古文化街 文化运动 汉责文化 良渚文化 红山文化 文化遗址 北京文化 海棠文化 金科文化 文化节 什么是文化 文化英文 美盛文化 酒文化