# Java工具类实现类似“超时”的效果

{% embed url="https://v.douyin.com/r81cLx4/" %}

{% embed url="https://www.bilibili.com/video/BV1dY4y1G72h/" %}

大家看这个 controller 很简单

就是每次请求他都做一个打印

就像这样

对吧那现在有个需求

就是不要让他每次请求都打印

我们需要实现一个类似于超时

3秒的效果

比如说他第一次请求进来之后呢

先不要打印等3秒（但正常响应）

如果这3秒钟之内

又有一个新请求进来

我们再重新计时再来3秒

直到最后超过3秒没有任何请求了

我们在一起打印一个总数

那碰这种延迟

或者叫超时的需求怎么实现呢

我给大家分享一个好玩的工具类

这个类呢是我自己封装的

它也特别简单

用到的都是java.util里边的一些类

然后怎么用呢

首先我们需要自己写一个 service

来继承这个类

然后把它注册成 spring 的 service

然后这个泛型是什么意思呢

就是根据你不同的业务需求

比如说我们这次的业务

就是做一个数据的累加

然后这个done（方法）是啥意思呢

就是最终那个3秒超时之后

最后走这个方法

然后怎么用呢

我们把它注入到这个 controller 里边

我现在注入好了

然后在这我们直接delay

这里边不是3秒吗我们就3,000毫秒

然后这里有个 callback

callback 什么意思呢

就是

他在两种情况下会调用

第一种情况就是第一次调用

用这个 old 还是空

所以呢我判断一下

如果 old 为空我们直接return一个否则的话呢每次都是 old + 1 就好了

我们在这打一个输出更新一下对

然后呢我们重启一下

好

我们来

试一下

大家看：更新 null (说明第一次）

再来、更新 注意看时间啊

现在13（秒）我们等2秒再来

他（15秒的时候）没有结束对吧

然后我们等一下

结束了大家看

15秒到18秒正好3秒

总共的次数是5次

这样就可以了

那如果一个项目里

有多个这种需求的话呢

大家就写多个这种 子类继承他就好了

比如说我这还写了一个这个（demo）

最后更新的字母串

大家看这是字母串类型的然后呢

哇这还有一个请求

他这个就每次更新

就是覆盖一个自动串

就把他最后的这个参数附进去

我们再来试一下这个哈

先来一个345 然后等3秒

大概最后一次就是所以呢

如果发挥想象的话呢

这块可以写一些封装类型

自己封装一些类

甚至我们放 list 的都可以

这个工具类呢

我还是把它放到了这个 get

gitlab（口误：github）的这个地方

大家有需要的话呢

可以自己来找
