java 中采用ScheduledExecutorService来进行定时任务调度。
ScheduledExecutorService是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
一、定时任务简单应用
1、简单的列子
public class Schedule1 {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
Runnable runnable = () -> {
String name = Thread.currentThread().getName();
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(name + ":RUN1 正在执行任务!" + format.format(new Date()));
};
scheduledThreadPool.scheduleAtFixedRate(runnable, 0, 2, TimeUnit.SECONDS);
}
}
2、ScheduledExecutorService
定时任务执行接口,有4中执行方法。
-
schedule(Runnable command,long delay, TimeUnit unit);
创建并执行在给定延迟后启用的ScheduledFuture。 -
schedule(Callable<V> callable, long delay, TimeUnit unit);
创建并执行在给定延迟后启用的单次操作。 -
scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit); 固定频率
首次是initialDelay+period;下次就间隔period执行;计时是按照上个开始时间计算,如果任务执行时间超过period,那下次就直接执行了。如果超过多个period,下次多个都会同时执行。
重点:一次执行失败会导致,整个调度失败,务必扑捉住错误。 -
scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit); 固定延迟
在上一个结束后和下一个开始之间给定延迟。
ScheduledThreadPoolExecutor
作为ScheduledExecutorService的具体实现类。创建实例时候我们可以直接new,但我们一般采用Executors 去创建实例。
ScheduledExecutorService scheduledThreadPool1=new ScheduledThreadPoolExecutor(10);
Executors
为方便管理线程,采用Executors 工厂方法去创建实例。
public class Executors {
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory) {
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory) {
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
}
取消定时任务
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setRemoveOnCancelPolicy(true);//cancel时会删除这个任务
scheduler.initialize();
ScheduledFuture<?> future=scheduler.scheduleAtFixedRate(runnable, 2000);
try {
Thread.sleep(10000);
} catch (Exception ex) {
ex.printStackTrace();
}
future.cancel(false);
System.out.println("执行任务完毕");
网友评论