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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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 这下完美了

java 实现 setTimeout 和 setInterval 效果相关推荐

  1. java 定时器返回值_javascript 函数返回值(return)、定时器(setTimeout、setInterval)...

    一.函数的返回值:return 1.函数名+括号=return后面的值 function fn1(){ return 100; } alert(fn1()); // 100 fn1()=return后 ...

  2. js基础之setTimeout与setInterval原理分析

    setTimeout与setInterval概述 setTimeout与setInterval是JavaScript引擎提供的两个定时器方法,分别用于函数的延时执行和循环调用.前者的主要思想是通过一个 ...

  3. setTimeout和setInterval实现定时器的区别

    这两个方法都能够用来实现在一个固定时间段之后去运行JavaScript.只是两者各有各的应用场景. 方 法 实际上,setTimeout和setInterval的语法相同.它们都有两个参数,一个是将要 ...

  4. js中计时器setTimeout、setInterval、requestAnimationFrame区别

    转载自:https://www.cnblogs.com/xiaohuochai/p/5777186.html 本文仅用于作为学习笔记 计时器一直是javascript动画的核心技术.而编写动画循环的关 ...

  5. setTimeout和setInterval的使用

    (节选自JavaScript精粹) 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setInterval的语 ...

  6. js 定时器用法详解——setTimeout()、setInterval()、clearTimeout()、clearInterval()

    写在前面: 在js应用中,定时器的作用就是可以设定当到达一个时间来执行一个函数,或者每隔几秒重复执行某段函数.这里面涉及到了三个函数方法:setInterval().setTimeout().clea ...

  7. nodejs计算时间间隔_NodeJs笔记:setTimeout 或 setInterval 的间隔时间执行

    在 nodejs 中有时要遇到运行一个请求时不成功,希望能让它停顿一个再进行相同的操作.如果使用 setTimeout 和 setInterval 你观察其执行时会发现它并不会是我们想要的间隔时间性的 ...

  8. java飘落的雪花_[Java教程]实现雪花飘落效果

    [Java教程]实现雪花飘落效果 0 2016-11-02 21:00:17 雪花飘落 body{background:#000;background: url(http://www.wallcoo. ...

  9. 用故事解析setTimeout和setInterval(内含js单线程和任务队列)

    用故事解析setTimeout和setInterval(内含js单线程和任务队列) 区别: setTimeout(fn,t): 延迟调用,超过了时间就调用回调函数,返回一个id,使用clearTime ...

最新文章

  1. Ajax无刷新实现图片切换特效
  2. spring 基于xml方式配置aop
  3. mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑
  4. sorl6.0+jetty+mysql搭建solr服务
  5. 深入浅出谈CUDA(二)
  6. MySql 随机读取多行数据并显示
  7. UML学习笔记(一):UML简介
  8. POJ 3734 Blocks 矩阵递推
  9. Android项目同步,如何通过gradle任务同步Android项目?
  10. Web前端经典面试题-JavaScript
  11. ARRI阿莱MXF修复方法
  12. 【计组】计算机乘法运算
  13. 一个开源知识管理系统,满足企业定制化需求
  14. 用户画像、用户分群、用户分层,到底有啥区别?
  15. 浏览器打开pdf乱码
  16. csr x509证书_证书格式简介 - CSR 文件生成 - 中国数字证书CHINASSL
  17. 关于PHPExcel导出单元格换行的问题
  18. linux和手机通讯,在Linux的系统下使用红外进行手机通讯
  19. NLP- 关键词提取 - 综述
  20. .snk文件用什么程序可以打开

热门文章

  1. 记录一次黑客丛林通关过程
  2. B站直播带货,带货直播数据如何查看?
  3. 什么软件可以支持视频合并?
  4. 内网视频会议系统的搭建过程(PoloMeeting)
  5. 安卓 仿学习app项目
  6. 基于Python深度学习的文字检测识别系统
  7. MySQL中, 如何查询某一天, 某一月, 某一年的数据.
  8. (附源码)springboot 大学英语智慧教学平台 毕业设计 201722
  9. APPYING独家:《复仇的小猪》的运营成长之路
  10. Java金钱小写转大写