定时器(案例)

117 阅读1分钟

定时器

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);
}