Timer中schedule和scheduleAtFixedRate的不同

package com.wzy.test.core.test.schedule;


import java.util.Timer;
import java.util.TimerTask;


/**
 * Timer中两个方法的区别
 * schedule  scheduleAtFixedRate
 * 方法参数一直 但是执行结果可能不同
 * 结论:
 * schedule 更注重时间周期性 必须保持间隔
 * scheduleAtFixedRate 更注重任务周期性 必须在固定时间点执行
 * 
 * 解释:
 * 如果定时任务的时间片是5s
 * 
 * 那么shedule中的认知是:我当中定时的任务是每5S执行一次 如果一个任务超过了调度时间 那么再第8S才调度完成 那么 shedule依然
 * 在按照5S之后 进行调度 那么13S 调度一次 18S调度一次 出现的结果是20S之内只调度了3次 但是预想的是4次 少了一次 如果对任务次数要求很高的
 * 那么就少了一次 
 * 
 * 但是scheduleAtFixedRate 中会发现任务在8S执行了 那么下次调度 会自行执行到10S 保证了次数的稳定
 */
public class ScheduleTest {


public static void main(String[] args) throws Exception{
ScheduleTest scheduleTest = new ScheduleTest();
TimerTest timerTest = scheduleTest.buildTimerTest(true,1);//能引用不能构建内部类 借用原先类进行构造
timerTest.start();


}

public TimerTest buildTimerTest(boolean needSleep,int type){
return new TimerTest(needSleep,type);
}

private class TimerTest implements taskCommand{

private boolean needSleep;//是否需要沉睡
private int type;//需要调用的方法类型

public TimerTest(boolean needSleep){
this.needSleep = needSleep;
type = 0;
}

public TimerTest(boolean needSleep,int type){
this.needSleep = needSleep;
this.type = type;
}

@Override
public void start(){
//执行特定的方法
switch(type){
case 0:

break;
case 1:
if(needSleep){
startWithSleep();
}else{
startWithNoSleep();
}
break;
default:
break;
}
}




//不沉睡直接执行定时
/**
* 执行结果
*/
//      type 0 
// TimerTast  run 1
// TimerTast  run 3
// TimerTast  run 5
// TimerTast  run 7
// TimerTast  run 9
// TimerTast  run 11

//      type 0 
// TimerTast  run 1
// TimerTast  run 3
// TimerTast  run 5
// TimerTast  run 7
// TimerTast  run 9
// TimerTast  run 11

private void startWithNoSleep(){

final long startMile = System.currentTimeMillis();
Timer timer = new Timer();
TimerTask timerTask = new TimerTask(){
public void run(){
long endMile = System.currentTimeMillis();
long result = endMile - startMile;
result = result/1000;
if(result > 10){
//如果执行了10S 那么停掉定时器
cancel();
}
System.out.println("TimerTast  run "+result);
}
};
//执行特定的方法
switch(type){
case 0:
timer.schedule(timerTask, 1000, 2000);
break;
case 1:
timer.scheduleAtFixedRate(timerTask, 1000, 2000);
break;
default:
break;
}

}


//沉睡执行定时
/**
* 执行结果
*/
// type 0 
// TimerTast  run 1
// TimerTast  run 4
// TimerTast  run 7
// TimerTast  run 9
// TimerTast  run 11

// type 1
// TimerTast  run 1
// TimerTast  run 4
// TimerTast  run 7
// TimerTast  run 7
// TimerTast  run 9
// TimerTast  run 11
private void startWithSleep(){
//在指定的时间内调度的次数
final long startMile = System.currentTimeMillis();
Timer timer = new Timer();
TimerTask timerTask = new TimerTask(){
public void run(){
long endMile = System.currentTimeMillis();
long result = endMile - startMile;
result = result/1000;
if(result > 10){
//如果执行了10S 那么停掉定时器
cancel();
}
if(result <5){
//如果超过了5S 不再睡眠
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}




System.out.println("TimerTast  run "+result);
}
};

//执行特定的方法
switch(type){
case 0:
timer.schedule(timerTask, 1000, 2000);
break;
case 1:
timer.scheduleAtFixedRate(timerTask, 1000, 2000);
break;
default:
break;
}
}
}


private interface taskCommand{

/**
* 执行任务
*/
public void start();

}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值