本文内容部分引自《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的用法和区别相关推荐

  1. java多线程调用一个函数_Java 多线程(一)

    1. 多线程使用方法 使用多线程,绝大部分情况都是通过如下两种方式实现的,即继承Thread类或者实现Runnable接口.以下对两种方式分别进行介绍并比较. 1.1 使用Thread类实现多线程 自 ...

  2. Educoder头歌—Java多线程基础常用函数

    第1关:线程的状态与调度 任务描述 本关任务:学习本关知识完成选择题. 相关知识 为了完成本关你需要掌握: 1.线程的状态与调度: 2.线程执行的优先级. 线程的状态与调度 如果看懂下图,你对线程的了 ...

  3. Java多线程--synchronized修饰普通方法和修饰静态方法的区别

    初始化一个对象时,会自动生成一个与该对象对应的对象锁,被synchronized 修饰的方法就得依靠对象锁工作.当多线程同时访问某个被synchronized修饰的方法时,一旦某个进程抢得对象锁之后, ...

  4. java多线程与并发原理

    三.java多线程与并发原理 1.进程和线程的区别: 进程和线程的由来: (1)串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入: (2)批处理:预先将用户的指令集集中成清单,批量串行处 ...

  5. 精选30道Java多线程面试题

    转载自 精选30道Java多线程面试题 1.线程和进程的区别 2.实现线程有哪几种方式? 3.线程有哪几种状态?它们之间如何流转的? 4.线程中的start()和run()方法有什么区别? 5.怎么终 ...

  6. Java多线程知识小抄集(一)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. JAVA Java多线程与并发库

    Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public ...

  8. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  9. Java多线程系列--【JUC线程池 02】- 线程池原理(一)

    参考:http://www.cnblogs.com/skywang12345/p/java_threads_category.html 概要 在前面一章"Java多线程系列--"J ...

最新文章

  1. 已解决:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshaketimeout
  2. exe4j生成可执行程序的使用方法
  3. 判断文件是否存在一个API函数
  4. P5591 小猪佩奇学数学(单位根反演)
  5. HDU 4740 The Donkey of Gui Zhou (模拟)
  6. Shell循环输入符合条件为止
  7. ubuntu20.04+vtd环境搭建
  8. 利用数据泵导入导出dmp
  9. 一个 SAP 开发工程师的 2022 年终总结:四十不惑
  10. ZooKeeper篇:2PC、3PC以及ZAB协议
  11. Unity文件转移出现的粉红色材质的处理方法
  12. Java 十进制转二进制
  13. ImportError: cannot import name ‘structural_similarity‘ from ‘skimage.measure‘
  14. 【机器学习实战】k-近邻算法案例——改进约会网站的配对效果
  15. 用CSS样式完成作业
  16. 小米电视系统服务器升级,小米电视怎么更新系统 升级步骤图文详解
  17. 解决某个程序、游戏无声音
  18. 【顶】辞职也需要辞得帅,辞得大家都开心,多为将来考虑,辞职不要急,本是好事要办好
  19. Jconsole的使用及对java内存池的专业术语理解
  20. 台式计算机开关电源的电压规格,开关电源电压如何调整如我的电脑开关电源有12V的直流电我想调整为14V的直流为其它电器供电,应该如何调整...

热门文章

  1. Oracle查询数据库密码哪一天过期,有效期时间,以及修改为永不过期
  2. Bluetooth技术学习笔记 ——GAP
  3. iptables防止nmap端口扫描
  4. 域名服务器虚拟主机购买,如何注册网站域名和购买虚拟主机
  5. glOrtho2D函数
  6. Ruby 第三方库集锦
  7. 英语语法笔记——补充(八)
  8. 【正点原子FPGA连载】第四十九章OV5640摄像头HDMI灰度显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  9. checkstyle自定义设置
  10. dedecms织梦搜索页有缩略图就调用无缩图就不显示