定时器是一种控制任务延时调用,或者周期调用的技术。
作用:闹钟、定时邮件发送。
定时器的实现方式:
- 方式一:Timer
-
Timer
// 1、创建 Timer 定时器Timer timer = new Timer(); // 定时器本身就是一个单线程。// 2、调用方法,处理定时任务 延迟 1s 执行 每隔 2s 执行timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "执行 AAA~~~ " + new Date());}}, 1000, 2000);
Timer 定时器的特点和存在的问题
Timer 是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入。
- 可能因为其中的某个任务的异常使 Timer 线程死掉,从而影响后续任务执行。
```java
// 1、创建 Timer 定时器
Timer timer = new Timer(); // 定时器本身就是一个单线程。
// 2、调用方法,处理定时任务
timer.schedule(new TimerTask() {
@Override
public void run() {
} }, 0, 2000);System.out.println(Thread.currentThread().getName() + " 执行 AAA ~~~ " + new Date()); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
// 任务受到影响 timer.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName() + “执行 BBB ~~~ “+ new Date()); } }, 0, 3000);
```java
// 1、创建 Timer 定时器
Timer timer = new Timer(); // 定时器本身就是一个单线程。
// 2、调用方法,处理定时任务
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行 AAA ~~~ " + new Date());
}
}, 0, 2000);
// 任务的异常使 Timer 线程死掉
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行 BBB ~~~ "+ new Date());
System.out.println(10/0);
}
}, 0, 2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行 CCC ~~~ "+ new Date());
}
}, 0, 3000);
ScheduledExecutorService
// 1、创建 ScheduledExecutorService 线程池,做定时器
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
// 2、开启定时任务
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行输出:AAA ==> " + new Date());
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 0, 2, TimeUnit.SECONDS);
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行输出:BBB ==> " + new Date());
System.out.println(10 / 0);
}
}, 0, 2, TimeUnit.SECONDS);
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 执行输出:CCC ==> " + new Date());
}
}, 0, 2, TimeUnit.SECONDS);
基于线程池,某个任务的执行情况不会影响其他定时任务的执行。
