一.通过模拟两个机器人的定时行为来加深对Timer相关函数的理解。
实现两个机器人第一个机器人会隔两秒打印最近一次计划的时间,执行内容
第二个机器人会模拟往桶里倒水,知道桶里的水满为止
代码示例:
DancingRobot类
package com.vishuo.timer;
import java.text.SimpleDateFormat;
import java.util.TimerTask;
public class DancingRobot extends TimerTask{
@Override
public void run() {
// TODO Auto-generated method stub
//获取最近的一次任务执行的时间,并将其格式化
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");
}
}
WaterRobot类
package com.vishuo.timer;
import java.util.Timer;
import java.util.TimerTask;
public class WaterRobot extends TimerTask{
private Timer timer;
//最大容量为5
private Integer buketCapacity = 0;
public WaterRobot(Timer InputTimer){
timer = InputTimer;
}
@Override
public void run() {
// TODO Auto-generated method stub
if(buketCapacity<5){
//灌水直至桶满为止
System.out.println("Add 1L water into the bucket!");
buketCapacity++;
}else{
//水满之后就停止执行
System.out.println("The number of canceled task ion timer is :"+timer.purge());
cancel();
System.out.println("The waterRobot has been aborted");
System.out.println("The number of canceled task ion timer is :"+timer.purge());
System.out.println("Current water is " + buketCapacity+"L");
//等待两秒钟,终止timer里面的所有内容
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
timer.cancel();
}
}
}
Executor演示类
package com.vishuo.timer;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
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);
}
}
二.Timer的缺陷
管理并发任务的缺陷:
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,且任务时间过长,会导致执行效果与预期不符。
当任务抛出异常时的缺陷:
如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行
Timer的使用禁区
对时效性要求较高的多任务并发作业
对复杂的任务的调度