个人简介
- 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。
- 欢迎点赞+收藏+留言
- 别慌,月亮也在大海某处迷茫
一、定时器概述
定时器是一种控制任务延时使用,或者周期调用的技术。eg:闹钟,定时邮件发送。
import java.util.Timer;
import java.util.TimerTask;
/**
* @author hanhan
* date 2022/4/21 22:12
* 努力已经来不及了,你得拼命
*/
public class TimerDemo_0 {
public static void main(String[] args) {
//创建Timer定时器对象
Timer t = new Timer();//定时器本身就是一个单线程
//TimerTask类实现了Runnable接口,所以需要重写run方法
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了");
}
},3000,2000);//第二个参数是延时调度,第三个参数是周期调度
}
}
Timer定时器的特点和存在问题:
1.Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入。
2.可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务的执行。
三、ScheduledExecutorService定时器
import java.util.Date;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author hanhan
* date 2022/4/23 17:11
* 努力已经来不及了,你得拼命
*/
public class TimerDemo_1 {
public static void main(String[] args) {
//创建ScheduledExecutorService线程池,做定时器
ScheduledExecutorService s = Executors.newScheduledThreadPool(3);
//开启定时任务
s.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行输出A"+"---"+new Date());
}
},0,2, TimeUnit.SECONDS);//最后一个参数是单位秒
s.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行输出B"+"---"+new Date());
}
},0,2, TimeUnit.SECONDS);
}
}
优点:基于线程池,某个任务的执行情况不会影响其他定时任务的执行。