Java多线程————定时器
一、定时器 定时器是一种控制任务延时调用,或者周期调用的技术。 作用:闹钟、定时邮件发送。
1、定时器的实现方式 方式一:Timer 方式二: ScheduledExecutorService
二、Timer定时器 1、构造器和方法
2、Timer定时器的特点和存在的问题
-
Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入。 可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行。
代码实例
package prohome; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerDemo1 { public static void main(String[] args) { // 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.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "执行BB~~~"+ new Date()); } }, 0, 2000); timer.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "执行CCC~~~"+ new Date()); } }, 0, 3000); } }
二、ScheduledExecutorService定时器 1、ScheduledExecutorService是 jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷, ScheduledExecutorService内部为线程池。
2、ScheduledExecutorService的优点 基于线程池,某个任务的执行情况不会影响其他定时任务的执行。
package prohome; import java.util.Date; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class TimerDemo2 { public static void main(String[] args) { // 创建ScheduleExecutorService 线程池 做定时器 ScheduledExecutorService pool = Executors.newScheduledThreadPool(3); // 开启定时任务 pool.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行输出:AAA==>"+new Date()); } },0,2, TimeUnit.SECONDS); pool.scheduleAtFixedRate(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"执行输出:BBB==>"+new Date()); } },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); } }
下一篇:
浅谈我理解的,bug如何定位前后端问题