简述

java.util.Timer是一个定时器,用来调度线程在某个时间执行。在初始化Timer时,开启一个线程循环提取TaskQueue任务数组中的任务,

如果任务数组为空,线程等待直到添加任务;

当添加任务时,唤醒线程,提取数组中标记为1的任务,

如果该任务状态为CANCELLED,则从数组中删除任务,继续循环提取任务

TimerTask

TimerTask是一个抽象类,它实现了Runnable接口,我们需要继承TimerTask来创建自己的任务类,然后可以使用Timer去调度我们自定义的任务类。

Timer是线程安全的,多个线程可以共享一个Timer对象不需要额外加锁。Timer使用java.util.TaskQueue 来存储添加的任务,在任何时间只有一个线程去执行TimerTask,例如,如果您正在创建一个计时器,每10秒运行一次,但是单线程执行需要20秒,计时器对象将继续向队列中添加任务,当一个线程完成后,它将通知队列,另一个线程将开始执行。

Timer对象使用Object对象的 wait 和 notify方法去调度TimerTask去执行的

事例

package com.lkf.mulithread;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; public class MyTimerTask extends TimerTask { @Override
public void run() { System.out.println("Timer task started at:"+new Date());
completeTask();
System.out.println("Timer task finished at:"+new Date());
} private void completeTask() {
try {
//任务完成需要20秒
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String args[]){
TimerTask timerTask = new MyTimerTask();
//running timer task as daemon thread
Timer timer = new Timer(true);
//每个10秒调度一次
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
System.out.println("TimerTask started");
//cancel after sometime
try {
Thread.sleep(120000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

定时器每隔10秒调度一次任务,一个任务执行时间需要20秒

输出结果:

TimerTask started
Timer task started at:Sun Mar 25 13:20:35 CST 2018
Timer task finished at:Sun Mar 25 13:20:55 CST 2018
Timer task started at:Sun Mar 25 13:20:55 CST 2018
Timer task finished at:Sun Mar 25 13:21:15 CST 2018
Timer task started at:Sun Mar 25 13:21:15 CST 2018
Timer task finished at:Sun Mar 25 13:21:35 CST 2018
Timer task started at:Sun Mar 25 13:21:35 CST 2018
Timer task finished at:Sun Mar 25 13:21:55 CST 2018
Timer task started at:Sun Mar 25 13:21:55 CST 2018
Timer task finished at:Sun Mar 25 13:22:15 CST 2018
Timer task started at:Sun Mar 25 13:22:15 CST 2018
TimerTask cancelled
Timer task finished at:Sun Mar 25 13:22:35 CST 2018

由输出结果可以确认,定时器将等待任务完成,一旦完成,它将再次从队列开始下一个任务

总结

Timer定时器可以作为守护线程对任务进行调度,计时器cancel()方法用于终止计时器并丢弃任何设置好的任务,但是,它不会干扰当前执行的任务,会让它完成。

当Timer定时器作为守护线程,一旦我们调用取消定时器方法,等所有正在执行的用户线程执行完毕,定时器线程将会被终止

定时器类包含多个schedule()方法,用于安排在给定日期或延迟之后运行一次任务,有几个scheduleAtFixedRate()方法在一定时间间隔内运行任务

当我们使用Timer作为定时任务调度器时,要确保调度时间间隔不大于任务运行时间,否则,任务队列大小将持续增长,最终任务将始终执行

另外当多线程并行处理定时任务时,Timer运行多个TimerTask时,只要其中一个任务抛出异常,那么所有的任务都将被终止

翻译自:https://www.journaldev.com/1050/java-timer-timertask-example?utm_source=website&utm_medium=sidebar&utm_campaign=Core-Java-Sidebar-Widget

Java线程之Timer的更多相关文章

  1. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  2. Java 多线程之Timer与ScheduledExecutorService

    1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器,比如每隔一段时间清理项目中的一些垃圾文件,每个一段时间进行数据清洗:然而Timer是存在一些缺陷的,因为Timer在执行定时任务时只 ...

  3. 多线程之Timer和TimerTask

    Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask.TimerTask是一个抽象类,实现了Runnabl ...

  4. java 线程之executors线程池

    一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...

  5. java 线程之concurrent中的常用工具 CyclicBarrier

    一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...

  6. C++/Java线程之分

    JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...

  7. Java线程之CompletionService批处理任务

    如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...

  8. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  9. Java线程之Java内存模型(jmm)

    一.Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial

随机推荐

  1. 怎样理解 Vue 的 "Hello, World!" 代码?

    直接复制以下代码到 html 文件中即可运行. <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  2. C#.net开发 List与DataTable相互转换

    1.DataTable转List集合 /// <summary> /// DataTable转化为List集合 /// </summary> /// <typeparam ...

  3. 实现表单label两端对齐

    主要使用css3属性 text-align: justify; text-align-last: justify; 上代码: <ul> <li> <label class ...

  4. (转)Java垃圾回收基本过程

    本编博客内容来自oschina,是一篇译文,文中图片比较直观的介绍了JVM进行垃圾回收的过程.原文内容来自oracle官网:Java Garbage Collection Basics oschina ...

  5. fastadmin中上传配置

    配置文件位于下图,默认代码如下 <?php //上传配置 return [ /** * 上传地址,默认是本地上传 */ 'rootpath' => '/uploads/', 'upload ...

  6. kubernetes之requests和limits

    说明 1.当集群中的计算资源不很充足, 如果集群中的pod负载突然加大, 就会使某个node的资源严重不足, 为了避免系统挂掉, 该node会选择清理某些pod来释放资源, 此时每个pod都可能成为牺 ...

  7. vmware 兼容问题

    1.出现此问题的原因是Device Guard或Credential Guard与Workstation不兼容.2.Windows系统的Hyper-V不兼容导致.解决方法: 步骤一:禁用Device ...

  8. Hive-ha (十三)

    hive-high Avaliable ​ hive的搭建方式有三种,分别是 ​ 1.Local/Embedded Metastore Database (Derby) ​ 2.Remote Meta ...

  9. POJ1639 算法竞赛进阶指南 野餐规划

    题目描述 原题链接 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种合 ...

  10. PAT乙级1025

    题目链接 https://pintia.cn/problem-sets/994805260223102976/problems/994805296180871168 题解 第一遍没有全部AC,最后1个 ...