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();
}
}
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();
}
}