android项目中使用Timer跟TimerTask时,发现IDE老是提示红色,一直提示我要用ScheduledExecutorService,相信使用android studio的小伙伴们一定不会陌生的,下面来看二者的使用
1、Timer
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("timerTask--run--" + sdf.format(new Date(System.currentTimeMillis())));
}
};
Timer timer = new Timer();
try {
timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
// timer.scheduleAtFixedRate(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
} catch (ParseException e) {
e.printStackTrace();
}
用法很简单,调用timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);这个方法,参数一表示任务,参数而表示延长多久时间执行,参数三表示间隔多久重复执行;
注意:timer.scheduleAtFixedRate()与timer.schedule()区别:
区别一:当设置的延迟时间是过去时间,则timer.schedule()会先执行一次然后按照间隔时间执行,而timer.scheduleAtFixedRate连续执行从time到现在应该执行的任务,直到当前时间再按照每隔period的时间执行
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("timerTask--run--1--" + sdf.format(new Date(System.currentTimeMillis())));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Timer timer = new Timer();
try {
// timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
timer.scheduleAtFixedRate(timerTask,sdf.parse("2018-12-27 11:21:00"),5000);
} catch (ParseException e) {
e.printStackTrace();
}
timerTask--run--1--2018-12-27 11:23:17
timerTask--run--1--2018-12-27 11:23:18
timerTask--run--1--2018-12-27 11:23:19
timerTask--run--1--2018-12-27 11:23:20
timerTask--run--1--2018-12-27 11:23:21
timerTask--run--1--2018-12-27 11:23:22
timerTask--run--1--2018-12-27 11:23:23
timerTask--run--1--2018-12-27 11:23:25
timerTask--run--1--2018-12-27 11:23:30
timerTask--run--1--2018-12-27 11:23:35
timerTask--run--1--2018-12-27 11:23:40
timerTask--run--1--2018-12-27 11:23:45
timer.schedule()执行日志
timerTask--run--1--2018-12-27 11:27:52
timerTask--run--1--2018-12-27 11:27:57
timerTask--run--1--2018-12-27 11:28:02
timerTask--run--1--2018-12-27 11:28:07
timerTask--run--1--2018-12-27 11:28:12
区别二:schedule方法的下一次执行时间是(本次准确执行时间+周期),而scheduleAtFixedRate方法的下一次执行是(本次应该执行的时间+周期)。schedule方法有可能因为上次任务的时间过长导致下次任务的执行时间往后推移,而scheduleAtFixed的每次任务的执行时间是固定的,只要这个任务被提交了,那么每次的执行时间就是固定的,但是我测试的时间都是一样都是执行时间如果大于间隔时间会等任务执行完以后才会执行下次任务,而且是以执行时间为准,这里不理解?求各位路过的大神指教
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("timerTask--run--1--" + sdf.format(new Date(System.currentTimeMillis())));
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Timer timer = new Timer();
try {
// timer.schedule(timerTask,sdf.parse("2018-12-26 17:32:00"),5000);
timer.scheduleAtFixedRate(timerTask,sdf.parse("2018-12-27 11:21:00"),5000);
} catch (ParseException e) {
e.printStackTrace();
}
timerTask--run--1--2018-12-27 11:35:39
timerTask--run--1--2018-12-27 11:35:45
timerTask--run--1--2018-12-27 11:35:51
timerTask--run--1--2018-12-27 11:35:57
timerTask--run--1--2018-12-27 11:36:03
timerTask--run--1--2018-12-27 11:36:09
timerTask--run--1--2018-12-27 11:36:15
timerTask--run--1--2018-12-27 11:36:21
日志都是一样的间隔6秒执行下次任务