Java高并发ScheduledThreadPoolExecutor与Timer区别攻略
在开发过程中,我们经常需要实现定时任务,此时Java提供了两种处理定时任务的类:ScheduledThreadPoolExecutor
和Timer
。这两个类都可以完成定时任务的功能,本文将分别介绍它们的区别和使用场景。
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor
是支持定时和周期性任务执行的线程池,它继承自ThreadPoolExecutor
类,实现了ScheduledExecutorService
接口和Executor
接口。ScheduledThreadPoolExecutor
可以在给定的延迟时间或循环周期内执行指定的任务。
使用ScheduledThreadPoolExecutor
时,可以设置线程数量、延迟时间和执行周期。
基本使用方法
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
// 任务延迟1秒后执行
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("任务延迟1秒后执行,当前时间:" + new Date());
}
}, 1, TimeUnit.SECONDS);
// 任务延迟1秒后首次执行,之后每隔2秒执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("任务延迟1秒后首次执行,之后每隔2秒执行一次,当前时间:" + new Date());
}
}, 1, 2, TimeUnit.SECONDS);
上面的代码创建了一个ScheduledExecutorService
线程池,其中有5个线程可用。分别使用schedule()
和scheduleAtFixedRate()
方法定义了两个定时任务,一个延迟1秒后执行,一个延迟1秒后首次执行,之后每隔2秒执行一次。
需要注意的是,schedule()
方法只会执行一次定时任务,但scheduleAtFixedRate()
方法会按照每隔一定时间执行任务的要求,不间断地执行下去。
适用场景
ScheduledThreadPoolExecutor
适用于需要支持大量的定时任务和周期性任务的场景,可以根据系统负载情况自动调整工作线程的数量,因此适用于高并发场景。
Timer
Timer
是Java提供的一种定时器任务调度类,它可以实现指定时间或周期性任务调度。在Java中,可以使用Timer
执行一次性任务或周期性任务。
基本使用方法
Timer timer = new Timer();
// 任务延迟1秒后执行
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("任务延迟1秒后执行,当前时间:" + new Date());
}
}, 1000);
// 任务延迟1秒后首次执行,之后每隔2秒执行一次
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("任务延迟1秒后首次执行,之后每隔2秒执行一次,当前时间:" + new Date());
}
}, 1000, 2000);
上面的代码创建了一个Timer
对象,分别使用schedule()
方法定义了两个定时任务,一个延迟1秒后执行,一个延迟1秒后首次执行,之后每隔2秒执行一次。
适用场景
Timer
适用于单线程且需要较少并发性能的场景,如果在任务执行期间其他定时任务需要执行,该任务可能会因为线程不足而被延迟执行,或者当任务抛出异常时,Timer便无法处理异常,只能停止执行所有任务。
两者区别
ScheduledThreadPoolExecutor
是线程池,多个线程可以并发执行;Timer
是单线程,只能串行执行。ScheduledThreadPoolExecutor
可以动态新增工作线程,同时可以设定最大线程数,适用于高并发场景;Timer
仅有一个工作线程,适用于处理简单的定时任务。ScheduledThreadPoolExecutor
可以更好地控制任务的执行时间和周期;Timer
执行任务会受上一个任务执行时间和任务间隔时间的影响。
结论
总的来说,如果需要定期执行任务且具有高并发性,则建议使用ScheduledThreadPoolExecutor
。而只有简单定时任务的场景,则使用Timer
方式即可,使用线程池的好处是可以动态控制线程的数量,尽量保持系统处理能力的平衡,更加灵活。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java高并发ScheduledThreadPoolExecutor与Timer区别 - Python技术站