【Java多线程编程核心技术】5.定时器Timer-笔记总结
2017-11-22 22:54
726 查看
相关链接:
【Java多线程编程核心技术】1.Java多线程技能-笔记总结
【Java多线程编程核心技术】2.对象及变量的并发访问(上)-笔记总结
【Java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结
【Java多线程编程核心技术】3.线程间通信 -笔记总结
【Java多线程编程核心技术】4.Lock的使用-笔记总结
【Java多线程编程核心技术】5.定时器Timer-笔记总结
【Java多线程编程核心技术】6.单例模式与多线程-笔记总结
【Java多线程编程核心技术】7.拾遗增补-笔记总结
private static Timer timer = new Timer(true); 表示将新建的Timer()改成守护线程。Daemon
如何执行任务的时间早于当前时间,则立即执行 task任务
Timer中运行有多个TimerTask任务
TimerTask是以队列的方式一个一个被顺序执行的,如果前面的任务消耗时间较长,则后面的任务运行的时间也会被延迟
执行时间早于当前时间时,则立即执行。
任务执行时间被延时
例如在run(){… sleep(5000) …} 而timer.schedule(taskA,dateRef,4000);
一个一个顺序运行,但间隔为5000毫秒
TimerTask类的cancel()方法
作用:将自身从任务队列中清除,其他任务不收影响
Timer类的cancel()方法
作用:将任务队列中的全部任务清空
schedule方法:下一次任务的执行时间参考上一次任务的“开始”时间,不具有追赶执行性。
scheduleAtFixedRate方法:参考上一次任务的结束时间,具有追赶执行性。(如下图:)
在计划时间早于当前时间时,立即执行!而且两个时间段内所对应的Task任务被“补充性”执行了,也就是Task任务追赶执行的特性
【Java多线程编程核心技术】1.Java多线程技能-笔记总结
【Java多线程编程核心技术】2.对象及变量的并发访问(上)-笔记总结
【Java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结
【Java多线程编程核心技术】3.线程间通信 -笔记总结
【Java多线程编程核心技术】4.Lock的使用-笔记总结
【Java多线程编程核心技术】5.定时器Timer-笔记总结
【Java多线程编程核心技术】6.单例模式与多线程-笔记总结
【Java多线程编程核心技术】7.拾遗增补-笔记总结
定时器Timer的使用
Time类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类(抽象类)方法schedule(TimerTask task,Date time)
作用:在指定的日期执行一次某任务;package test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Run1 { private static Timer timer = new Timer(); // private static Timer timer = new Timer(true); static public c 4000 lass MyTask extends TimerTask { @Override public void run() { System.out.println("运行了!时间为:" + new Date()); } } public static void main(String[] args) { try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = "2017-11-22 19:43:10"; Date dateRef = sdf.parse(dateString); System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:" + new Date().toLocaleString()); timer.schedule(task, dateRef); } catch (ParseException e) { e.printStackTrace(); } } } 输出结果: 字符串时间:2017-11-22 19:43:10 当前时间:2017-11-22 19:43:05 运行了!时间为:Wed Nov 22 19:43:10 CST 2017
private static Timer timer = new Timer(true); 表示将新建的Timer()改成守护线程。Daemon
如何执行任务的时间早于当前时间,则立即执行 task任务
Timer中运行有多个TimerTask任务
timer.schedule(task1,dateRef1); timer.schedule(task2,dateRef1);
TimerTask是以队列的方式一个一个被顺序执行的,如果前面的任务消耗时间较长,则后面的任务运行的时间也会被延迟
方法schedule(TimerTask task,Date firstTime,long period)
作用:在指定的日期之后,按指定的间隔周期性地无限循环地执行某一个任务。package test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Run { static public class MyTask extends TimerTask { @Override public void run() { System.out.println("运行了!时间为:" + new Date()); } } public static void main(String[] args) { try { MyTask task = new MyTask(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = "2014-10-12 09:12:00"; Timer timer = new Timer(); Date dateRef = sdf.parse(dateString); System.out.println("字符串时间:" + dateRef.toLocaleString() + " 当前时间:" + new Date().toLocaleString()); timer.schedule(task, dateRef, 4000); } catch (ParseException e) { e.printStackTrace(); } } } 输出结果: 字符串时间:2017-11-22 19:51:30 当前时间:2017-11-22 19:51:18 运行了!时间为:Wed Nov 22 19:51:30 CST 2017 运行了!时间为:Wed Nov 22 19:51:34 CST 2017 运行了!时间为:Wed Nov 22 19:51:38 CST 2017 ......
执行时间早于当前时间时,则立即执行。
任务执行时间被延时
例如在run(){… sleep(5000) …} 而timer.schedule(taskA,dateRef,4000);
一个一个顺序运行,但间隔为5000毫秒
TimerTask类的cancel()方法
作用:将自身从任务队列中清除,其他任务不收影响
Timer类的cancel()方法
作用:将任务队列中的全部任务清空
方法schedule(TimerTask task,long delay)
作用:以当前时间为参考时间,在此基础上延迟指定毫秒数后执行一次TimerTask任务。方法schedule(TimerTask task,long delay,long period)
作用:以当前时间为参考时间,在此时间基础上延迟指定的毫秒数,再以某一间隔时间无限次数地执行某一个任务。方法scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
在不延时的情况下schedule方法:下一次任务的执行时间参考上一次任务的“开始”时间,不具有追赶执行性。
scheduleAtFixedRate方法:参考上一次任务的结束时间,具有追赶执行性。(如下图:)
package test.run; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class Run6 { private static Timer timer = new Timer(); static public class MyTask1 extends TimerTask { @Override public void run() { System.out.println("1 begin 运行了!时间为:" + new Date()); System.out.println("1 end 运行了!时间为:" + new Date()); } } public static void main(String[] args) { try { MyTask1 task1 = new MyTask1(); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString1 = "2017-11-22 20:08:30"; Date dateRef1 = sdf1.parse(dateString1); System.out.println("字符串1时间:" + dateRef1.toLocaleString() + " 当前时间:" + new Date().toLocaleString()); timer.scheduleAtFixedRate(task1, dateRef1, 5000); } catch (ParseException e) { e.printStackTrace(); } } } 输出结果: 字符串1时间:2017-11-22 20:08:30 当前时间:2017-11-22 20:08:46 1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 begin 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:08:46 CST 2017 1 begin 运行了!时间为:Wed Nov 22 20:08:50 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:08:50 CST 2017 1 begin 运行了!时间为:Wed Nov 22 20:08:55 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:08:55 CST 2017 1 begin 运行了!时间为:Wed Nov 22 20:09:00 CST 2017 1 end 运行了!时间为:Wed Nov 22 20:09:00 CST 2017 ........
在计划时间早于当前时间时,立即执行!而且两个时间段内所对应的Task任务被“补充性”执行了,也就是Task任务追赶执行的特性
相关文章推荐
- Java多线程编程核心技术(第五章定时器Timer笔记)
- 【Java多线程编程核心技术】7.拾遗增补-笔记总结
- 【Java多线程编程核心技术】1.Java多线程技能-笔记总结
- 《Java 多线程编程核心技术》学习笔记及总结
- 【Java多线程编程核心技术】2.对象及变量的并发访问(下)-笔记总结
- 【Java多线程编程核心技术】4.Lock的使用-笔记总结
- 一、java多线程编程核心技术之(笔记)——多线程的实现
- java多线程核心技术 第五章 定时器Timer
- 看书笔记--JAVA多线程编程核心技术
- Java多线程核心技术(五):定时器Timer
- Java多线程编程核心技术--定时器
- 二、java多线程编程核心技术之(笔记)——如何停止线程?
- Java多线程编程核心技术 第一章笔记
- java多线程编程核心技术第一章笔记
- Java多线程编程核心技术 阅读笔记
- java多线程编程核心技术笔记-脏读
- Java多线程编程核心技术--定时器
- java多线程核心技术编程笔记
- java多线程编程核心技术笔记-停止线程interrupt()方法
- java多线程编程核心技术知识点总结