timer和ScheduledThreadPoolExecutor

在JDK1.5的时候在java.util.concurrent并发包下引入了ScheduledThreadPoolExecutor类,引入它的原因是因为Timer类创建的延迟周期性任务存在一些缺陷, ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,并且实现了ScheduledExecutorService接口, ScheduledThreadPoolExecutor也是通过schedule方法执行Runnable任务的。

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); //创建5个执行线程

Runnable runnable = new Runnable() {

@Override
public void run() {
String time = new SimpleDateFormat("HH:mm:ss").format(new Date());
System.out.println("Now Time : " + time);
}
};

executor.scheduleWithFixedDelay(runnable, 2, 3, TimeUnit.SECONDS);//2是首次延迟时间,3是定期执行的间隔时间

timer的缺陷:是单线程的,如果一个任务的执行耗时,那么其他任务会出现实效的问题;不捕获异常,timetask抛出异常会导致整个timer不会执行,新的任务不会被调度;timer是基于绝对时间的,对系统时间比较敏感,而ScheduledThreadPoolExecutor是基于相对时间,他在内部存储了距离下次执行所需要的时间。

posted @ 2017-10-11 10:32  zmoony  阅读(128)  评论(0编辑  收藏  举报