package 线程;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class ThreadRunTest implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
private static class TimerRemind{
Timer timer=new Timer();
public void excuteByDelay(){
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask:只执行一次,并且是1秒后执行");
}
},1000);
}
public void excuteDelayAndPeriod(){
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask.excuteDelayAndPeriod:第一次1秒后执行,以后每2秒执行一次"+new Date());
try {
Thread.sleep(4000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},1000,2000);
}
public void excuteRate(){
//压缩间隔时间
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask.excuteRate:第一次1秒后执行,以后每2秒执行一次"+new Date());
try {
Thread.sleep(2000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},1000,3000);
}
}
public static void main(String[] args){
//new TimerRemind().excuteByDelay();
new TimerRemind().excuteRate();
}
}
scheduleAtFixedRate和schedule的区别
例如: delay 为2s ,period为3s
理论上他们的执行频率应该是 0,3,6,9....
但是如果执行方法耗时长 比如耗时1s
schedule的实际执行时间是: 0,4,7,10...(原因是执行业务逻辑时耗时1s,所以下次执行时会等上次执行完毕之后再继续)
scheduleAtFixedRate实行时间为:0,3,6,9... 并没有受业务执行耗时的影响
如果业务执行时间大于周期时间就会按照业务执行时间的长度来
比如我设置耗时6秒
这样的两个方法就没有区别了,因为都是同一个线程在执行
取消定时任务
timer.cancel();
其实任务的开始是在 new Timer()中,里面有一个静态Thread常量用来开启线程,并且Timer重写了Run();方法,然后调用mainLoop();方法实现不停的执行task
觉得文章有帮助的话就赞赏下吧!
微信:
支付宝: