笔记来源: IMOOC Java Timer
schedule(task, time)
html
参数java
做用android
schedule(task, time, period)
并发
参数app
做用ide
schedule(task, delay)
函数
参数工具
做用this
schedule(task, delay, period)
spa
参数
做用
scheduleAtFixedRate(task, time, period)
参数
做用
scheduleAtFixedRate(task, delay, period)
参数
做用
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.TimerTask; public class MyTimerTask extends TimerTask { private String name; public MyTimerTask(String inputName) { name = inputName; } @Override public void run() { // 以 yyyy-MM-dd HH:mm:ss 的格式打印当前执行时间 Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current exec time is: " + sf.format(calendar.getTime())); // 打印当前name的内容 System.out.println("Current exec name is: " + name); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; public class MyTimer { public static void main(String[] args) { // 1. 建立一个timer实例 Timer timer = new Timer(); // 2. 建立一个MyTimerTask实例 MyTimerTask myTimerTask = new MyTimerTask("No.1"); /** * 获取当前时间,并设置成距离当前时间三秒后的时间 */ Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current main time is: " + sf.format(calendar.getTime())); calendar.add(Calendar.SECOND, 3); // 3. 经过timer定时定频率调用myTimerTask的业务逻辑 //-------------------schedule的四种用法-------------------// /** * 在时间等于或超过time的时间执行且仅执行一次task */ myTimerTask.setName("schedule_1"); timer.schedule(myTimerTask, calendar.getTime()); /** * 时间等于或超过time时首次执行task,以后每隔period毫秒重复执行一次task */ myTimerTask.setName("schedule_2"); timer.schedule(myTimerTask, calendar.getTime(), 2000); /** * 等待delay毫秒后执行且仅执行一次task */ myTimerTask.setName("schedule_3"); timer.schedule(myTimerTask, 1000); /** * 等待delay毫秒后首次执行task,以后每隔period毫秒重复执行一次task */ myTimerTask.setName("schedule_4"); timer.schedule(myTimerTask, 3000, 2000); //--------------scheduleAtFixedRate的两种用法-------------// /** * 时间等于或超过time时首次执行task,以后每隔period毫秒重复执行一次task */ myTimerTask.setName("scheduleAtFixedRate_1"); timer.scheduleAtFixedRate(myTimerTask, calendar.getTime(), 2000); /** * 等待delay毫秒后首次执行task,以后每隔period毫秒重复执行一次task */ myTimerTask.setName("scheduleAtFixedRate_2"); timer.scheduleAtFixedRate(myTimerTask, 3000, 2000); } }
schedule
方法
fixed-delay
;若是第一次执行时间被 delay 了,随后的执行时间按照上一次实际执行完成的时间点进行计算scheduleAtFixedRate
方法
fixed-rate
;若是第一次执行时间被 delay 了,随后的执行时间按照上一次开始的时间点进行计算,而且为了遇上进度会屡次执行任务,所以 TimerTask
中的执行体须要考虑同步 schedule
方法
scheduleAtFixedRate
方法
TimerTask
的 cancel()
、scheduleExecutionTime()
Timer
的 cancel()
、purge()
cancel()
TimerTask
里的任务scheduleExecutionTime()
cancel()
purge()
模拟两个机器人的定时行为
/** * 跳舞的机器人 */ public class DancingRobot extends TimerTask { @Override public void run() { // 获取最近的一次任务执行的时间,并将其格式化 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Scheduled exec time is: " + sf.format(scheduledExecutionTime())); System.out.println("Dancing happily!"); } } /** * 倒水的机器人 */ public class WaterRobot extends TimerTask { private Timer timer; // 最大容量为5L private Integer bucketCapacity = 0; public WaterRobot(Timer inputTimer) { timer = inputTimer; } @Override public void run() { // 灌水直接至桶满为止 if(bucketCapacity < 5){ System.out.println("Add 1L water into the bucket!"); bucketCapacity ++; } else { // 水满以后就中止执行 System.out.println("The number of canceled task in timer is: " + timer.purge()); cancel(); System.out.println("The waterRobot has been aborted"); System.out.println("The number of canceled task in timer is: " + timer.purge()); System.out.println("Current water is " + bucketCapacity + "L"); // 等待两秒钟,终止timer里面的全部内容 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } timer.cancel(); } } } public class Executor { public static void main(String[] args) { Timer timer = new Timer(); // 获取当前时间 Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current time is: " + sf.format(calendar.getTime())); DancingRobot dr = new DancingRobot(); WaterRobot wr = new WaterRobot(timer); timer.schedule(dr, calendar.getTime(), 2000); timer.scheduleAtFixedRate(wr, calendar.getTime(), 1000); } }
管理并发任务的缺陷
当任务抛出异常时的缺陷
TimerTask
抛出 RuntimeException
,Timer 会中止全部任务的运行