Java多线程(十四):Timer
Timer
schedule(TimerTask task, Date time)
该方法在指定日期执行任务,如果是过去的时间,这个任务会立即被执行。
执行时间早于当前时间
示例代码,当前时间是2019年9月19日,代码中写的是前一天的时间。
public class MyTask1 extends TimerTask {
private static Timer timer = new Timer();
public void run()
{
System.out.println("运行了!时间为:" + new Date());
}
public static void main(String[] args) throws Exception
{
MyTask1 task = new MyTask1();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2019-9-18 21:22:00";
Date dateRef = sdf.parse(dateString);
System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:" + new Date().toLocaleString());
timer.schedule(task, dateRef);
}
}
运行结果如下
字符串时间:2019-9-18 21:22:00 当前时间:2019-9-19 20:18:26
运行了!时间为:Thu Sep 19 20:18:26 CEST 2019
可以看到,过去的时间立即执行。
执行时间晚于当前时间
修改代码的dateString改为未来的时间,如"2019-9-19 20:22:00"
运行结果如下
字符串时间:2019-9-19 20:22:00 当前时间:2019-9-19 20:21:22
运行了!时间为:Thu Sep 19 20:22:00 CEST 2019
可以看到,未来的时间要等到目标时间才会执行。
多个Timer同时执行
示例代码如下
public class MyTask2 extends TimerTask {
private static Timer timer = new Timer();
public void run()
{
System.out.println("运行了!时间为:" + new Date());
}
public static void main(String[] args) throws Exception
{
MyTask2 task1 = new MyTask2();
MyTask2 task2 = new MyTask2();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString1 = "2019-9-19 21:12:00";
String dateString2 = "2019-9-19 21:12:00";
Date dateRef1 = sdf1.parse(dateString1);
Date dateRef2 = sdf2.parse(dateString2);
System.out.println("字符串时间:" + dateRef1.toLocaleString() + " 当前时间:" + new Date().toLocaleString());
System.out.println("字符串时间:" + dateRef2.toLocaleString() + " 当前时间:" + new Date().toLocaleString());
timer.schedule(task1, dateRef1);
timer.schedule(task2, dateRef2);
}
}
运行结果如下
字符串时间:2019-9-19 21:12:00 当前时间:2019-9-19 21:11:57
字符串时间:2019-9-19 21:12:00 当前时间:2019-9-19 21:11:57
运行了!时间为:Thu Sep 19 21:12:00 CEST 2019
运行了!时间为:Thu Sep 19 21:12:00 CEST 2019
说明可以多任务执行。执行时间和当前时间的关系规则同上。
schedule(TimerTask task, Date firstTime, long period)
该方法在指定的时间执行任务,间隔period时间再次执行,无限循环。
执行时间早于当前时间
示例代码
public class MyTask3 extends TimerTask {
public void run()
{
System.out.println("运行了!时间为:" + new Date());
}
public static void main(String[] args) throws Exception
{
MyTask3 task = new MyTask3();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = "2019-09-19 22:01:00";
Timer timer = new Timer();
Date dateRef = sdf.parse(dateString);
System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:" + new Date().toLocaleString());
timer.schedule(task, dateRef, 4000);
}
}
运行结果如下
字符串时间:2019-9-19 22:01:00 当前时间:2019-9-19 22:09:13
运行了!时间为:Thu Sep 19 22:09:13 CEST 2019
运行了!时间为:Thu Sep 19 22:09:17 CEST 2019
运行了!时间为:Thu Sep 19 22:09:21 CEST 2019
运行了!时间为:Thu Sep 19 22:09:25 CEST 2019
···
可以看到,立即执行。
执行时间晚于当前时间
运行结果如下
字符串时间:2019-9-19 22:12:00 当前时间:2019-9-19 22:11:24
运行了!时间为:Thu Sep 19 22:12:00 CEST 2019
运行了!时间为:Thu Sep 19 22:12:04 CEST 2019
运行了!时间为:Thu Sep 19 22:12:08 CEST 2019
运行了!时间为:Thu Sep 19 22:12:12 CEST 2019
运行了!时间为:Thu Sep 19 22:12:16 CEST 2019
···
Java多线程(十四):Timer的更多相关文章
- Java多线程(四)java中的Sleep方法
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- “全栈2019”Java多线程第四章:设置和获取线程名称
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第九十四章:局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第十四章:二进制、八进制、十六进制
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- java多线程系列(四)---Lock的使用
Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理 ...
- java多线程系列(四)---ReentrantLock的使用
Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我的理 ...
- Java多线程核心技术(四)Lock的使用
本文主要介绍使用Java5中Lock对象也能实现同步的效果,而且在使用上更加方便. 本文着重掌握如下2个知识点: ReentrantLock 类的使用. ReentrantReadWriteLock ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
- java 多线程 23 : Timer
前言 定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单.定时更新某些缓存.定时清理一批不活跃用户等等.定时计划任务功能在Java中主要使用的就是Tim ...
随机推荐
- 自己动手实现MQTT协议
写在前面 前段时间弄IoT相关的东西,系统学习了一下 MQTT 协议,在此分享出来. 本文先是对 MQTT 协议做了简单的介绍:接着是对 MQTT协议的内容做了较为全面的解读:最后使用 Python ...
- centos7 yum搭建lnmp环境及配置wordpress超详细教程
yum安装lnmp环境是最方便,最快捷的一种方法.源码编译安装需要花费大量的人类时间,当然源码编译可以个性化配置一些其它功能.目前来说,yum安装基本满足我们搭建web服务器的需求. 本文是我根据近期 ...
- VMware Workstation 15 Pro 永久激活密钥
VMware Workstation 15 Pro 永久激活密钥 一. 激活密钥 YG5H2-ANZ0H-M8ERY-TXZZZ-YKRV8 UG5J2-0ME12-M89WY-NPWXX-WQH ...
- python 16 模块
目录 模块 1. 自定义模块 1.1 模块分类 1.2 模块的导入 1.3 import 和 from 1.4 from 模块名 import * 1.5 模块的用法: 1.6 导入路径 2. tim ...
- unity之初级工程师
一.值类型与引用类型 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中.值类型变量声明后,不管是否已经赋值,编译器为其分配内存.值类型的实例通常是在线程栈上分配的(静态 ...
- Docker资源管理
一台宿主机可以放多个容器,默认的情况下,Docker 没有对容器进行硬件资源的限制,当容器负载过高时会尽可能的占用宿主机资源,所以有时候我们需要对容器的资源使用设置一个上限,今天我们就来看看如何管理 ...
- Python基础学习笔记(一)python发展史与优缺点,岗位与薪资
相信有好多朋友们都是第一次了解python吧,可能大家也听过或接触过这个编程语言.那么到底什么是python呢?它在什么机缘巧合下诞生的呢?又为什么在短短十几年时间内就流行开来呢?就请大家带着疑问,让 ...
- MySQL IN和EXISTS的效率问题,以及执行优化
网上可以查到很多这样的说法: 如果查询的两个表大小相当,那么用in和exists差别不大.如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 例如:表A(小表),表B ...
- 独家解读 etcd 3.4版本 |云原生生态周报 Vol. 18
作者 | 酒祝.墨封.宇慕.衷源 关注"阿里巴巴云原生"公众号,回复关键词 "资料" ,即可获得 2019 全年 meetup 活动 PPT 合集及 K8s 最 ...
- 深入理解 Handler 消息机制
记得很多年前的一次面试中,面试官问了这么一个问题,你在项目中一般如何实现线程切换? 他的本意应该是考察 RxJava 的使用,只是我的答案是 Handler,他也就没有再追问下去了.在早期 Andro ...