1. public void schedule(TimerTask task,Date time) 这个方法中如启动时,已经过了time的时间,则系统会在启动后直接执行一次,
话不多少直接上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
packagecom.test.timer.task;
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.Timer;
importjava.util.TimerTask;
importorg.junit.Test;
/**
*
* java实现定时器的若干方法
*
* @author jimi
*
*/
publicclassTestTask{
privatestaticTimertimer=newTimer();
privatestaticDateFormatdateFormat=newSimpleDateFormat("HH:mm:ss");
publicstaticvoidmain(String[]args){
Calendarcalendar=Calendar.getInstance();
intyear=calendar.get(Calendar.YEAR);
intmonth=calendar.get(Calendar.MONTH);
intday=calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(year,month,day,20,35,00);
//如果这个时间已经过了,则会启动会立即执行一次
timer.schedule(newTimerTask(){
@Override
publicvoidrun(){
System.out.println("固定执行任务的时间:"+dateFormat.format(newDate()));
}
},calendar.getTime());
}
}
代码中我指定在当天的20时35分执行,启动程序后的结果如下:
可以看到我程序是在20:40:47执行的,已经超过我设置的20时35分00秒,所以启动后直接执行一次。
2. schedule(TimerTask task,long delay,long period) 和 scheduleAtFixedRate(TimerTask task,long delay,long period)方法的区别
简单来说就是定时执行scheduleAtFixedRate不受外界影响,假如某一次TimerTask执行时间超过了定时执行周期,下一次执行时间不会受该任务执行时间的影响,
依然会在指定时间执行,而schedule则会受影响,直接上代码来看:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
packagecom.test.timer.task;
importjava.text.DateFormat;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.Timer;
importjava.util.TimerTask;
/**
*
* java实现定时器的若干方法
*
* @author jimi
*
*/
publicclassTestTask{
privatestaticTimertimer=newTimer();
privatestaticDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
privatestaticintindex=0;
publicstaticvoidmain(String[]args)throwsParseException{
//固定速率
timer.scheduleAtFixedRate(newTimerTask(){
@Override
publicvoidrun(){
index++;
if(index%5==0){
try{
Thread.sleep(5000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println("每隔4秒执行一次:"+dateFormat.format(newDate()));
}
},0,4000);
}
}
从代码可以看出,在index为5的倍数时,程序会休眠5秒,我们了来看看执行的结果
每隔4秒执行一次:2018-08-10 19:12:09
每隔4秒执行一次:2018-08-10 19:12:13
每隔4秒执行一次:2018-08-10 19:12:17
每隔4秒执行一次:2018-08-10 19:12:21
每隔4秒执行一次:2018-08-10 19:12:30
每隔4秒执行一次:2018-08-10 19:12:30
每隔4秒执行一次:2018-08-10 19:12:33
每隔4秒执行一次:2018-08-10 19:12:37
每隔4秒执行一次:2018-08-10 19:12:41
每隔4秒执行一次:2018-08-10 19:12:50
每隔4秒执行一次:2018-08-10 19:12:50
每隔4秒执行一次:2018-08-10 19:12:53
每隔4秒执行一次:2018-08-10 19:12:57
每隔4秒执行一次:2018-08-10 19:13:01
每隔4秒执行一次:2018-08-10 19:13:10
每隔4秒执行一次:2018-08-10 19:13:10
我们可以看出在第五次和第六次同时运行,且第七次的时间并未是在19:12:30的基础加4秒,而是在程序启动后预先计算好的时间也就是19:12:33秒,所可以看scheduleAtFixedRate的执行时间是按照预先的固定速率来执行,不会因为某一次的延迟而影响后面的计划时间。
我们再来看看schedule的代码和执行情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
packagecom.test.timer.task;
importjava.text.DateFormat;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
importjava.util.Timer;
importjava.util.TimerTask;
/**
*
* java实现定时器的若干方法
*
* @author jimi
*
*/
publicclassTestTask{
privatestaticTimertimer=newTimer();
privatestaticDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
privatestaticintindex=0;
publicstaticvoidmain(String[]args)throwsParseException{
//非固定速率
timer.schedule(newTimerTask(){
@Override
publicvoidrun(){
index++;
if(index%5==0){
try{
Thread.sleep(5000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
System.out.println("每隔4秒执行一次:"+dateFormat.format(newDate()));
}
},0,4000);
}
}
执行情况如下
每隔4秒执行一次:2018-08-10 19:17:12
每隔4秒执行一次:2018-08-10 19:17:16
每隔4秒执行一次:2018-08-10 19:17:20
每隔4秒执行一次:2018-08-10 19:17:24
每隔4秒执行一次:2018-08-10 19:17:33
每隔4秒执行一次:2018-08-10 19:17:33
每隔4秒执行一次:2018-08-10 19:17:37
每隔4秒执行一次:2018-08-10 19:17:41
每隔4秒执行一次:2018-08-10 19:17:45
每隔4秒执行一次:2018-08-10 19:17:54
每隔4秒执行一次:2018-08-10 19:17:54
每隔4秒执行一次:2018-08-10 19:17:58
可以看出schedule在执行完第5、6次任务后,第7次的时间则是按照定时计划4秒后执行的,可见schedule在任务执行过程中,如果某一次任务延时,则后续任务会跟着延时后的时间重新计算定时执行时间。