目录
·前言
本篇文章会利用多线程的知识来编写一个代码案例——定时器,我会先介绍一下什么是定时器,再来介绍一下我们标准库中的定时器以及操作演示我们标准库中定时器的效果,最后我来手撕出来一个功能上与所演示标准库中定时器效果差不多的定时器,并对其实现的具体逻辑,在代码中进行详细介绍,那么就开始本篇文章介绍的内容吧。
一、什么是定时器
定时器是我们在平时开发过程中经常使用到的一个组件,它的功能类似于“闹钟”,作用就是当有一个要执行的任务,对定时器设定一个时间并把任务传入定时器,当时间到了的时候,定时器就会自动执行其中的任务,比如在 Redis 中的 EXPIRE 命令就是为 key 设置秒级的过期时间,设置完成,在到时间之后就会自动删除这个 key,如果你也写博客,那你一定有看到 优快云 上有一个定时发布的功能吧,如下图所示:
那么下面我们就来演示一下定时器在代码中执行的效果。
二、标准库中的定时器
1.介绍
在我们的 Java 标准库中也提供了定时器的实现,具体的类是 Timer 类,Timer 类的核心方法就是 schedule ,在 schedule 方法中包含了两个参数,如下:
- 第一个参数指定要执行的任务代码;
- 第二个参数指定多长时间后执行这个任务(单位:ms)。
2.使用
简单介绍了一下 Timer 类之后,我就来使用一下这个类,以及其核心方法 schedule 来演示一下它具体的效果,代码及运行结果如下所示:
import java.util.Timer;
import java.util.TimerTask;
// 测试标准库中的定时器
public class ThreadDemo9 {
public static void main(String[] args) throws InterruptedException {
// 创建 Timer 对象
Timer timer = new Timer();
// 调用 schedule 方法来添加任务,并指定多少 ms 后执行
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello 3000");
}
},3000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello 2000");
}
},2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello 1000");
}
},1000);
// 休眠 5000 ms 让任务都执行结束
Thread.sleep(5000);
// 调用 cancel 方法来关闭定时器
timer.cancel();
}
}
上述代码中调用 cancel 方法是来关闭定时器,如果不调用这个方法,程序的运行结果就会如下图所示:
上述代码运行起来之后会等到 1s,2s,3s 依次到达时间后执行对应的任务。