java 实现 setTimeout 和 setInterval 效果
一. 先实现setTimeout
其实就是利用java的Timer类与TimerTask类实现setTimeout的效果。
代码如下:
import java.util.Timer;
import java.util.TimerTask;
new Timer().schedule(new TimerTask() {
public void run() {
System.out.println("Hello World");
}
}, 2000);
上面代码虽然实现了 setTimeout 的效果, 但还不够简洁, 于是 稍微修改一下
- 首先新建一个接口
public interface Callback {
/**
* 回调函数专用接口
*/
void run();
}
- 再新建一个 Timeout 类
import java.util.Timer;
import java.util.TimerTask;
/**
* Timeout
* 稍微封装一下
* @author hengzi
* @date 2022/7/27
*/
public class Timeout {
private Timer timer;
public Timeout() {
}
public Timeout(Callback callback, long delay){
timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
callback.run();
// 执行完就退出
timer.cancel();
}
};
timer.schedule(timerTask,delay);
}
public void cancel(){
if(timer!=null){
timer.cancel();
}
}
}
于是 你就可以完全像js那样 调用了
new Timeout(()-> System.out.println("Hello World"), 2000);
new Timeout(()-> {
// do something
}, 5*60*1000);
舒服!
二. 接下来实现 setInterval ,新建 Interval.java
import java.util.Timer;
import java.util.TimerTask;
/**
* Interval
*
* @author hengzi
* @date 2022/7/29
*/
public class Interval {
private Timer timer;
public Interval() {
}
public Interval(Callback callback, long period) {
timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
callback.run();
}
};
timer.schedule(timerTask,0,period);
}
public void cancel(){
if(timer!=null){
timer.cancel();
}
}
}
调用
new Interval(()-> {
// do something
}, 1000);
// 一秒钟执行一次
OK,现在可以了,但是这个Interval
只能定时执行,其实很多时候,执不执行都是要看情况的,或者有次数限制的,那么我们再进一步写一个SmartInterval
来实现这个效果。
三. 进阶 Interval
首先 定义一个接口SmartCallback
内容很简单
/**
* SmartCallback
*
* @author hengzi
* @date 2022/7/29
*/
public interface SmartCallback {
/**
* 回调函数专用接口
* @return 是否继续执行
*/
boolean run();
}
再写一个 SmartInterval.java
/**
* SmartInterval
*
* @author hengzi
* @date 2022/7/29
*/
public class SmartInterval {
private Timer timer;
private int count;
public SmartInterval() {
}
/**
* SmartInterval
* @param callback 需要循环执行的函数
* @param period 间隔 多少毫秒执行一次
* @param limit 一共执行多少次 为 0 则不限制 会一直执行
*/
public SmartInterval(SmartCallback callback, long period, int limit) {
new SmartInterval( callback, period, limit,()->{});
}
/**
* SmartInterval
* @param callback 需要循环执行的函数
* @param period 间隔 多少毫秒执行一次
* @param limit 一共执行多少次 为 0 则不限制 会一直执行
* @param afterLimit 达到上限后 执行的函数, 也就是最后一次执行之后要干嘛,相当于 关闭前执行的函数
*/
public SmartInterval(SmartCallback callback, long period, int limit,Callback afterLimit){
timer = new Timer();
count = 0;
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
boolean run = callback.run();
count++;
if(limit !=0 && count>=limit){
afterLimit.run();
timer.cancel();
}
if(!run){
// 不跑了 就取消
timer.cancel();
}
}
};
timer.schedule(timerTask,0,period);
}
public void cancel(){
if(timer!=null){
timer.cancel();
}
}
}
调用
new SmartInterval(()->{
// do something
// return true 继续执行 return false 停止执行
return true;
},1000,60,()->{
// 一秒钟执行一次, 一共执行 60 次
System.out.println("执行了60次");
});
new SmartInterval(()->{
System.out.println("一秒钟过去了");
return true;
},1000,0);
OK 这下完美了