☕导航小助手☕
🍚写在前面
写在前面
继多线程的阻塞队列之后,我们来学习一下 第三个经典的案例 —— 定时器~
定时器,也是开发中的一个比较常用的基础组件~
定时器,就像闹钟一样,闹钟在达到一个设定的时间以后,就会发出响声来提醒;而定时器到了设定好的时间以后,就会执行某个指定好的代码~
下面,让我们一起来看看吧~
一、定时器概述
定时器,又称 任务定时执行器~
即:到了一定的时间,就会去执行指定的任务~
在 Java标准库中,提供了一个带有定时器功能的 Timer类,Timer类 的核心方法是 schedule方法~
schedule方法 包含了两个参数,第一个参数为 即将要执行的任务代码,第二个参数为 指定多长时间后执行地一个参数中的代码(单位是 毫秒)~
如:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("hello");
}
}, 3000);
二、定时器的实现
2.1 Java标准库 定时器的使用
package thread;
import java.util.Timer;
import java.util.TimerTask;
public class Demo23 {
public static void main(String[] args) {
//Timer 是 java.util 里的一个组件
Timer timer = new Timer();
//schedule 这个方法的效果是 "安排一个任务",不是立即执行,而是等到设定好的时间之后再执行
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("这是一个要执行的任务");
}
},4000);
}
}
运行结果:
在观察运行结果之后,就会提出两个小问题:
问题一:程序执行完之后,为啥没有结束呢?
实现定时器,背后涉及到了多线程,Timer 里面有线程,这个线程的运行阻止了 进程的退出~
问题二:那为什么不直接使用 sleep 呢,还专门搞了一个定时器?
使用 sleep 是把当前线程给阻塞了~
换句话说,sleep 的时间里,啥也干不了,只能干等着;但是使用定时器,之前的线程该干啥干啥~
我们可以来证实一下,加一些代码并且观察运行结果:
package thread;
import java.util.Timer;
import java.util.TimerTask;
public class Demo23 {
public static void main(String[] args) throws InterruptedException {
//Timer 是 java.util 里的一个组件
Timer timer = new Timer();
//schedule 这个方法的效果是 "安排一个任务",不是立即执行,而是等到设定好的时间之后再执行
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("这是一个要执行的任务");
}
},5000);
while (true) {
System.out.println("main");
Thread.sleep(1000);
}
}
}
运行结果:
我们从中可以看出,在 定时器定时的那段时间里,线程是在继续干活的,仍然在打印出 main~
如果使用 sleep,那么这段时间就只能干等了~
所以,平常使用的还是定时器较多~