定时器
1、定时器时一种任务延时调用,或者周期调用的技术 作用:闹钟,定时邮件发送
定时器的实现方式
方式一:Timer 方式二:ScheduledExecutorService
方式一(Timer)
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "输出AAA" + new Date());
try {
Thread.sleep(300000);//执行时间过长会影响其他定时任务的执行,出现异常也会终止其他定时任务
} catch (Exception e) {
e.printStackTrace();
}
}
},0,2000);
t.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "输出BBB" + new Date());
}
},0,2000);
}
Timer定时器有非常大的弊端:
1、Timer是一个单线程,处理多个任务时,存在延时与设定时间有出入 2、可能因为其中某个任务的异常导致Timer线程的死亡,从而影响后续任务的执行
方式二(ScheduledExecutorService)
ScheduledExecutorService是从JDk1.5引入了并发包,目的是为了弥补Timer的缺陷,ScheduledExecutorService的内部为线程池。
ScheduledExecutorService的优点是基于线程池,某个任务的执行不会影响其他定时任务的执行
public static void main(String[] args) throws Exception {
ScheduledExecutorService sce = Executors.newScheduledThreadPool(3);//创建线程池对象
sce.scheduleAtFixedRate(new TimerTask() {//周期调度方法
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "输出AAA、" + new Date());
try {
Thread.sleep(3000000);//即使线程执行时间很久也不会影响其他任务的执行
} catch (Exception e) {
e.printStackTrace();
}
}
},0,2, TimeUnit.SECONDS);
sce.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);
sce.scheduleAtFixedRate(new TimerTask() {//周期调度方法
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "输出CCC、" + new Date());
}
},0,2, TimeUnit.SECONDS);
}