定时/计算在java中主要使用的是Timer对象,他的内部依然是采用多线程方式进行处理

它有四个构造方法

方法名 作用
Timer() 空参
Timer(String name) 指定名字
Timer(boolean isDaemon) 指定为守护线程
Timer(String name,boolean isDaman) 指定名字,指定为守护线程

Timer类的主要作用就是设置计划任务,但是封装任务的类确是TimerTask,TimerTask实现了Runable接口,因此我们要做的也就是重写run方法,定义我们的任务


  • 简单使用
public class demo01 extends TimerTask {
@Override
public void run() {
System.out.println("计划执行了, "+new Date());
} public static void main(String[] args) {
System.out.println("当前时间 "+ new Date()); Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND,5);
Date time = calendar.getTime();
demo01 task = new demo01();
Timer timer = new Timer();
timer.schedule(task,time);
System.out.println("主线程结束了...");
}
}

程序执行完了,但是进程仍然没有被撤销,呈红色状态,那是因为每创建一个Timer对象,就是启动一条线程,并且这条线程不是守护线程,会一直执行下去


常用的几个Timer对象的API

1. 安排在指定的时间执行指定的任务,如果时间过去了,立即执行

void schedule(TimerTask task,Date time)

一个Timer对象,可以拥有多个TimerTask,而TimerTask是以队列的方法,一个一个顺序执行,这也就可能导致执行的时间和预期的时间不一样,因为前面的任务执行的时间可能比较长,那么后面的任务也就被延后了


2. 在指定的日期到达之后,按照指定的时间间隔,执行一次某任务

schedule(TimerTask task , Date firstTime,Long period)

注意点:

  1. firstTime晚于当前时间,计划未来
  2. firstTime早于当前时间,计划立即执行
  3. 任务依然可能被延迟

3, 以当前时间为准,在此时间基础上延迟指定的时间毫秒数执行一次TimerTask任务

schedule(TimerTask task, Long delay)

5 .当前的时间为参考,在此时间基础上延迟指定的毫秒数,再以某一个时间间隔,无限次执行某一任务

schedule(TimerTask task,Long delay,Long period)

6. 测试schedule&scheduleAtFixedRate几种情况

不延迟 描述
Date类型 下一次执行任务的时间,都是上一次任务开始的时间+period
Long类型 第一次任务执行的时间是任务开始的时间+delay,接下来执行任务的时间是上一次任务开始的时间+priod
延迟 描述
Date类型 下一次执行任务的时间,都是上一次任务结束的时间+period
Long类型 下一次执行任务的时间是上一次任务结束的时间+priod

7. 追赶性

举个例子什么是追赶性,假如说,程序运行到A行代码时,时间是t1,程序继续往下执行,遇到了B行代码,我们希望,B在A前10秒执行给定的任务,可是按照我们的顺序,A已经执行了,那么实现我们的要求就用到了scheduleAtFixedRate的追赶性

示例代码:

/*
* schedule的追赶性
* */
public class demo03 extends TimerTask { @Override
public void run() {
System.out.println("任务开始的时间"+new Date());
System.out.println("任务结束的时间"+new Date());
} public static void main(String[] args) {
System.out.println("现在执行的时间+"+new Date()); demo03 task = new demo03(); Calendar instance = Calendar.getInstance();
instance.set(Calendar.SECOND,instance.get((Calendar.SECOND)-10));
Date time = instance.getTime();
System.out.println("计划执行的时间"+ time);
Timer timer = new Timer();
timer.scheduleAtFixedRate(task,time,2000);
}
}

结果:

现在执行的时间+Sat Feb 16 07:17:14 CST 2019
计划执行的时间Sat Feb 16 07:17:07 CST 2019
任务开始的时间Sat Feb 16 07:17:14 CST 2019
任务结束的时间Sat Feb 16 07:17:14 CST 2019
任务开始的时间Sat Feb 16 07:17:14 CST 2019
任务结束的时间Sat Feb 16 07:17:14 CST 2019
任务开始的时间Sat Feb 16 07:17:14 CST 2019
任务结束的时间Sat Feb 16 07:17:14 CST 2019
任务开始的时间Sat Feb 16 07:17:14 CST 2019
任务结束的时间Sat Feb 16 07:17:14 CST 2019
任务开始的时间Sat Feb 16 07:17:15 CST 2019
任务结束的时间Sat Feb 16 07:17:15 CST 2019
任务开始的时间Sat Feb 16 07:17:17 CST 2019
任务结束的时间Sat Feb 16 07:17:17 CST 2019
任务开始的时间Sat Feb 16 07:17:19 CST 2019
任务结束的时间Sat Feb 16 07:17:19 CST 2019
任务开始的时间Sat Feb 16 07:17:21 CST 2019
任务结束的时间Sat Feb 16 07:17:21 CST 2019
任务开始的时间Sat Feb 16 07:17:23 CST 2019
...

TimerTaskTimer的cancel方法

  • TimerTask的cancel()自然由TimerTask对象调用,它本身是任务队列中的一个任务,作用是把自身从任务队列中进行清除
  • Timer的cancel()方法**把整个任务队列清除

Timer的cancel的注意事项

public class demo02 extends TimerTask {

    private int i;

    public demo02(int i) {
this.i = i;
} @Override
public void run() {
System.out.println("任务被第"+i+"次执行,没有被取消");
} public static void main(String[] args) {
int i=0;
Calendar calendar = Calendar.getInstance();
Date time = calendar.getTime(); while(true){
i++;
Timer timer = new Timer();
timer.schedule(new demo02(i),time);
timer.cancel();
} }

运行结果

任务被第32412次执行,没有被取消

原因是Timer类中的cancel方法,有时抢不到任务队列的锁,而让TimerTask类中的任务正常执行


参考书籍<<java多线程编程核心技术>>高洪岩著

多线程十 Timer的更多相关文章

  1. java多线程--定时器Timer的使用

    定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定 ...

  2. 多线程&定时器Timer&同步&线程通信&ThreadLocal

    1.多线程 线程状态分为:新建状态.就绪状态.运行状态.阻塞状态.死亡状态 对象等待池的阻塞状态:运行状态执行了wait方法 对向锁池的阻塞状态:试图获得某个同步锁,已经被其他线程占用,就会放到对象的 ...

  3. 多线程-定时器Timer

    2019-04-1218:03:32 package 多线程.定时器Timer_重要; import java.util.Timer; import java.util.TimerTask; publ ...

  4. 多线程 定时器 Timer TimerTask

    定时器是一种特殊的多线程,使用Timer来安排一次或者重复执行某个任务 package org.zln.thread; import java.util.Date; import java.util. ...

  5. 多线程十之CopyOnWriteArrayList源码分析

    目录 简介 类结构 源码解析 构造方法 add(E e) add(int index, E element) get(int index) remove(int index) 迭代器Iterator遍 ...

  6. Java 多线程--ThreadLocal Timer ExecutorService

    ThreadLocal /** * ThreadLocal:每个线程自身的存储本地.局部区域 * @author xzlf * */ public class ThreadLocalTest01 { ...

  7. c# 中的多线程和异步

    前言: 1.异步和多线程有区别吗? 答案:多线程可以说是实现异步的一种方法方法,两者的共同目的:使主线程保持对用户操作的实时响应,如点击.拖拽.输入字符等.使主程序看起来实时都保持着等待用户响应的状态 ...

  8. .NET中的三种Timer的区别和用法

    最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应 ...

  9. .NET中的三种Timer的区别和用法(转)

      最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗 ...

随机推荐

  1. 面试题:为什么客户端最后还要等待2MSL

    面试题: 为什么客户端最后还要等待2MSL MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值. 保证客户端发送的最后一个ACK报文能够到达服务器, ...

  2. AI-Azure上的认知服务之Computer Vision(计算机视觉)

    使用 Azure 的计算机视觉服务,开发人员可以访问用于处理图像并返回信息的高级算法. 主要包含如下高级算法: 标记视觉特性Tag visual features 检测对象Detect objects ...

  3. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [下篇]

    由于ASP.NET Core框架在本质上就是由服务器和中间件构建的消息处理管道,所以在它上面构建的应用开发框架都是建立在某种类型的中间件上,整个ASP.NET Core MVC开发框架就是建立在用来实 ...

  4. Mysql基于Mysql Cluster+MysqlRouter的集群部署方案

    http://note.youdao.com/noteshare?id=a61c4a6ff2b76e5305430eb66eb116e2&sub=4B4B6E8D0E2849F9B0DFB67 ...

  5. dotnetcore执行shell脚本

    我们可以使有dotnetcore跨平台的特性,优雅的实现在dotnetcore执行shell (bash).  代码如下: using System; using System.Collections ...

  6. 手写SpringMVC

    环境描述 idea java 8 1. POM文件 <?xml version="1.0" encoding="UTF-8"?> <proje ...

  7. 通过ADB获取Android手机信息

    原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CPU,厂商名称等)adb shell "ca ...

  8. IO测试工具 - 用于IO测试 ; linux benchmarks

    IO测试工具,用于磁盘IO测试,下面进行使用列表进行记录: iozone fio dd ioping iotop iostat bonnie++ crystalDisk Atto as-ssd-ben ...

  9. delete和Vue.$delete删除数组的区别

    delete delete只是被删除的元素变成了 empty/undefined ,其他的元素的键值对应关系还是不变. Vue.$delete 直接删除了数组中元素,数组的键值对应关系发生相应变化 例 ...

  10. IoT缺德相关

    https://github.com/nebgnahz/awesome-iot-hacks <揭秘家用路由器0day漏洞挖掘技术> Embedded Device Security: Pw ...