关于TimerTask里面的scheduledExecutionTime()方法,一些见解

本文通过实验对比了Java中Timer类使用不同参数schedule方法时scheduledExecutionTime()返回值的差异,并总结了该方法在不同场景下的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者为了测试TimerTask里面的scheduledExecutionTime()这个方法,编写了如下测试代码


public class MyTimerTest02 {
	public static void main(String[] args) {
		Timer timer=new Timer();
//		Calendar calendar=Calendar.getInstance();
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-hh HH:mm:ss");
		System.out.println(sdf.format(date));
//		calendar.add(Calendar.SECOND, 2);
		
//		myTimerTask02.setName("test TimerTask Cancel");
//		
//		timer.schedule(myTimerTask02, 2000, 1000);
		
		TimerTask03 myTimerTask03=new TimerTask03("near time");
		timer.schedule(myTimerTask03,2000,1000);
		System.out.println("Timer最近会执行的Task的时间:"+sdf.format(myTimerTask03.scheduledExecutionTime()));
	}
}

public class TimerTask03 extends TimerTask{
	private String name;
	public TimerTask03(String name)
	{
		this.name=name;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
//		Calendar calendar=Calendar.getInstance();
		System.out.println("------------>");
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-hh HH:mm:ss");
//		System.out.println("Timer最近会执行的Task的时间:"+sdf.format(scheduledExecutionTime()));
		System.out.println("This TimerTask's time is "+sdf.format(new Date()));
		System.out.println("This TimerTask's name is "+name);
		System.out.println("<------------");
		System.out.println();
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}


执行结果截取

2017-12-10 22:00:32
Timer最近会执行的Task的时间:2017-12-10 22:00:33
------------>
This TimerTask's time is 2017-12-10 22:00:34
This TimerTask's name is near time
<------------

------------>
This TimerTask's time is 2017-12-10 22:00:35
This TimerTask's name is near time
<------------


由此看来当你在测试类下面直接调用scheduledExecutionTime()预计时间会出现偏差


但是如果你把

timer.schedule(myTimerTask03,2000,1000);

改成如下

timer.schedule(myTimerTask03,2000);

结果就是

2017-12-10 22:04:33
Timer最近会执行的Task的时间:2017-12-10 22:04:35
------------>
This TimerTask's time is 2017-12-10 22:04:35
This TimerTask's name is near time
<------------

小结:如果把scheduledExecutionTime()放在测试类使用测试出来的预计执行时间结果分两种情况

1、timer使用两个参数的schedule是准确的

2、timer使用三个参数的schedule是会比实际执行情况少一分钟


如果我把测试类改成这样

public class MyTimerTest02 {
	public static void main(String[] args) {
		Timer timer=new Timer();
//		Calendar calendar=Calendar.getInstance();
		Date date=new Date();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-hh HH:mm:ss");
		System.out.println(sdf.format(date));
//		calendar.add(Calendar.SECOND, 2);
		
//		myTimerTask02.setName("test TimerTask Cancel");
//		
//		timer.schedule(myTimerTask02, 2000, 1000);
		
		TimerTask03 myTimerTask03=new TimerTask03("near time");
		timer.schedule(myTimerTask03,2000,1000);
//		System.out.println("Timer最近会执行的Task的时间:"+sdf.format(myTimerTask03.scheduledExecutionTime()));
	}
}

把TimerTask03改成

public class TimerTask03 extends TimerTask{
	private String name;
	public TimerTask03(String name)
	{
		this.name=name;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
//		Calendar calendar=Calendar.getInstance();
		System.out.println("------------>");
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-hh HH:mm:ss");
		System.out.println("Timer最近会执行的Task的时间:"+sdf.format(scheduledExecutionTime()));
		System.out.println("This TimerTask's time is "+sdf.format(new Date()));
		System.out.println("This TimerTask's name is "+name);
		System.out.println("<------------");
		System.out.println();
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}


结果是

2017-12-10 22:07:25
------------>
Timer最近会执行的Task的时间:2017-12-10 22:07:28
This TimerTask's time is 2017-12-10 22:07:28
This TimerTask's name is near time
<------------

------------>
Timer最近会执行的Task的时间:2017-12-10 22:07:29
This TimerTask's time is 2017-12-10 22:07:29
This TimerTask's name is near time
<------------

小结:在Task类里面调用scheduledExecutionTime()

因为是预计执行时间,取的是最近注意是最近,在Task里面调用之后,时间就是当前调用Task的时间。


总结:这个scheduledExecutionTime()还是有略微的问题的,我就不分析底层了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值