Java多线程问题--schedule函数和scheduleAtFixedRate的用法和区别
本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!
代码地址:https://github.com/xianzhixianzhixian/thread.git
schedule函数和scheduleAtFixedRate的用法和区别
1、schedule(TimerTask task, Date time)的作用
在指定的时间执行任务,如果指定时间早于当前时间则立即执行任务,如果指定时间晚于当前时间则等待到指定时间再执行任务
2、TimerTask类中的cancel()的作用
TimerTask的cancel()方法cancel()方法作用是将自身从任务队列中清除,其它任务不受影响
3、Timer类的cancel()的作用
Timer类中的cancel()方法的作用是将任务队列中的全部任务清空,但是会存在失效的情况,因为timer.cancel()无法获得queue的锁,源码所示
4、schedule(TimerTask task, long delay)的作用
以当前时间为参考,在此时间基础上延迟指定时间的毫秒数后执行一次TimerTask任务
5、schedule(TimerTask task, Date firstTime, long period)的作用
在指定日期之后,按指定的间隔周期性地无限地执行某一任务
6、schedule(TimerTask task,long delay,long period)的作用
以当前时间为参考,在此时间基础上延迟指定毫秒数,再以某一时间间隔无限次数地执行某一任务
7、TimerTask是以队列方式一个一个被顺序执行的,并且是线程安全的
8、schedule方法任务延时时:下一次运行开始的时间是上一个任务的结束时间。schedule方法任务不延时时:下一次运行开始的时间是以上一个任务开始的时间加上period时间。scheduleAtFixedRate延时:下一个任务的开始时间是上一个任务的结束时间。scheduleAtFixedRate不延时时:下一个任务的开始时间是上一个任务的结束时间(上一次任务的开始时间加上delay时间,此处delay时间为run()函数中的Thread.sleep()的时间)。
9、schedule方法不具有追赶性,scheduleAtFixedRate方法具有追赶性。个人理解:不具有追赶性的意思是上一个任务执行完毕后(不延时),下一个任务的开始时间为上一个任务的开始时间加上period时间,两个时间段之间的任务被取消了。具有追赶性的意思是上一个任务执行完毕后(不延时),下一个任务的开始时间为上一个任务的结束时间。
schedule函数和scheduleAtFixedRate的示例
不延迟时
ScheduleNotDelay.java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;/*** 测试schedule方法任务不延时* 下一次运行开始的时间是以上一个任务开始的时间加上period时间* @author: xianzhixianzhixian* @date: 2019-02-13 22:09*/
public class ScheduleNotDelay {private static Timer timer = new Timer();private static int runCount = 0;static public class MyTask extends TimerTask {@Overridepublic void run() {try {System.out.println("1 begin 运行了!时间为:"+new Date());Thread.sleep(1000);System.out.println("1 end 运行了!时间为:"+new Date());runCount++;if (runCount == 5) {timer.cancel();}} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {MyTask task = new MyTask();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString = "2019-02-13 15:11:00";Date dateRef = sdf.parse(dateString);System.out.println("字符串1时间:"+dateRef.toLocaleString()+" 当前时间:"+new Date().toLocaleString());timer.schedule(task, dateRef, 4000);} catch (Exception e) {e.printStackTrace();}}
}
运行结果:schedule方法任务不延时,下一次运行开始的时间是以上一个任务开始的时间加上period时间
ScheduleAtFixedRateNotDelay.java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;/*** 测试scheduleAtFixedRate不延时* 下一个任务的开始时间是上一个任务的结束时间(上一次任务的开始时间加上delay时间,此处delay时间为run()函数中的Thread.sleep()的时间)* @author: xianzhixianzhixian* @date: 2019-02-13 22:24*/
public class ScheduleAtFixedRateNotDelay {private static Timer timer = new Timer();private static int runCount = 0;static public class MyTask extends TimerTask {@Overridepublic void run() {try {System.out.println("1 begin 运行了!时间为:"+new Date());Thread.sleep(1000);System.out.println("1 end 运行了!时间为:"+new Date());runCount++;if (runCount == 5) {timer.cancel();}} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {MyTask task = new MyTask();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString = "2019-02-13 22:33:00";Date dateRef = sdf.parse(dateString);System.out.println("字符串1时间:"+dateRef.toLocaleString()+" 当前时间:"+new Date().toLocaleString());timer.scheduleAtFixedRate(task, dateRef, 4000);} catch (Exception e) {e.printStackTrace();}}
}
运行结果:scheduleAtFixedRate不延时,下一个任务的开始时间是上一个任务的结束时间(上一次任务的开始时间加上delay时间,此处delay时间为run()函数中的Thread.sleep()的时间)
延迟时
ScheduleDelay.java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;/*** 测试schedule方法任务延时* 下一次运行开始的时间是上一个任务的结束时间* @author: xianzhixianzhixian* @date: 2019-02-13 22:18*/
public class ScheduleDelay {private static Timer timer = new Timer();private static int runCount = 0;static public class MyTask extends TimerTask {@Overridepublic void run() {try {System.out.println("1 begin 运行了!时间为:"+new Date());Thread.sleep(5000);System.out.println("1 end 运行了!时间为:"+new Date());runCount++;if (runCount == 5) {timer.cancel();}} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {MyTask task = new MyTask();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString = "2019-02-13 15:11:00";Date dateRef = sdf.parse(dateString);System.out.println("字符串1时间:"+dateRef.toLocaleString()+" 当前时间:"+new Date().toLocaleString());timer.schedule(task, dateRef, 4000);} catch (Exception e) {e.printStackTrace();}}
}
运行结果:schedule方法任务延时,下一次运行开始的时间是上一个任务的结束时间
ScheduleAtFixedRateDelay.java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;/*** 测试scheduleAtFixedRate延时* 下一个任务的开始时间是上一个任务的结束时间* @author: xianzhixianzhixian* @date: 2019-02-13 22:24*/
public class ScheduleAtFixedRateDelay {private static Timer timer = new Timer();private static int runCount = 0;static public class MyTask extends TimerTask {@Overridepublic void run() {try {System.out.println("1 begin 运行了!时间为:"+new Date());Thread.sleep(5000);System.out.println("1 end 运行了!时间为:"+new Date());runCount++;if (runCount == 5) {timer.cancel();}} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {MyTask task = new MyTask();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString = "2019-02-13 15:11:00";Date dateRef = sdf.parse(dateString);System.out.println("字符串1时间:"+dateRef.toLocaleString()+" 当前时间:"+new Date().toLocaleString());timer.scheduleAtFixedRate(task, dateRef, 4000);} catch (Exception e) {e.printStackTrace();}}
}
运行结果:scheduleAtFixedRate延时,下一个任务的开始时间是上一个任务的结束时间
Java多线程问题--schedule函数和scheduleAtFixedRate的用法和区别相关推荐
- java多线程调用一个函数_Java 多线程(一)
1. 多线程使用方法 使用多线程,绝大部分情况都是通过如下两种方式实现的,即继承Thread类或者实现Runnable接口.以下对两种方式分别进行介绍并比较. 1.1 使用Thread类实现多线程 自 ...
- Educoder头歌—Java多线程基础常用函数
第1关:线程的状态与调度 任务描述 本关任务:学习本关知识完成选择题. 相关知识 为了完成本关你需要掌握: 1.线程的状态与调度: 2.线程执行的优先级. 线程的状态与调度 如果看懂下图,你对线程的了 ...
- Java多线程--synchronized修饰普通方法和修饰静态方法的区别
初始化一个对象时,会自动生成一个与该对象对应的对象锁,被synchronized 修饰的方法就得依靠对象锁工作.当多线程同时访问某个被synchronized修饰的方法时,一旦某个进程抢得对象锁之后, ...
- java多线程与并发原理
三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...
- 精选30道Java多线程面试题
转载自 精选30道Java多线程面试题 1.线程和进程的区别 2.实现线程有哪几种方式? 3.线程有哪几种状态?它们之间如何流转的? 4.线程中的start()和run()方法有什么区别? 5.怎么终 ...
- Java多线程知识小抄集(一)
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- JAVA Java多线程与并发库
Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...
- java多线程学习笔记。
java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...
- Java多线程系列--【JUC线程池 02】- 线程池原理(一)
参考:http://www.cnblogs.com/skywang12345/p/java_threads_category.html 概要 在前面一章"Java多线程系列--"J ...
最新文章
- 已解决:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshaketimeout
- exe4j生成可执行程序的使用方法
- 判断文件是否存在一个API函数
- P5591 小猪佩奇学数学(单位根反演)
- HDU 4740 The Donkey of Gui Zhou (模拟)
- Shell循环输入符合条件为止
- ubuntu20.04+vtd环境搭建
- 利用数据泵导入导出dmp
- 一个 SAP 开发工程师的 2022 年终总结:四十不惑
- ZooKeeper篇:2PC、3PC以及ZAB协议
- Unity文件转移出现的粉红色材质的处理方法
- Java 十进制转二进制
- ImportError: cannot import name ‘structural_similarity‘ from ‘skimage.measure‘
- 【机器学习实战】k-近邻算法案例——改进约会网站的配对效果
- 用CSS样式完成作业
- 小米电视系统服务器升级,小米电视怎么更新系统 升级步骤图文详解
- 解决某个程序、游戏无声音
- 【顶】辞职也需要辞得帅,辞得大家都开心,多为将来考虑,辞职不要急,本是好事要办好
- Jconsole的使用及对java内存池的专业术语理解
- 台式计算机开关电源的电压规格,开关电源电压如何调整如我的电脑开关电源有12V的直流电我想调整为14V的直流为其它电器供电,应该如何调整...