java定时器timer用法_Java之定时器任务Timer用法

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分执行,启动程序后的结果如下:

7966ca4662a165f121fc0bb1dc09c166.png

可以看到我程序是在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在任务执行过程中,如果某一次任务延时,则后续任务会跟着延时后的时间重新计算定时执行时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值