java 实现 setTimeout 和 setInterval 效果

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 的效果, 但还不够简洁, 于是 稍微修改一下

  1. 首先新建一个接口
public interface Callback {

    /**
     * 回调函数专用接口
     */
    void run();
}
  1. 再新建一个 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 这下完美了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值