import java.time.LocalTime;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class MyScheduleUtils {
static class TaskThreadFactory implements ThreadFactory {
private static final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
public TaskThreadFactory(String namePrefix) {
this.namePrefix = namePrefix + "-";
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(Thread.currentThread().getThreadGroup(), r, this.namePrefix + threadNumber.getAndIncrement());
t.setDaemon(true);
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
public static ScheduledThreadPoolExecutor scheduleAtFixedRate(Runnable runnable, long delaySecs, long spanSecs, String taskName) {
if (spanSecs < 0) {
throw new IllegalArgumentException("spanSecs[" + spanSecs + "] must >0");
}
if (delaySecs <= 0) {
delaySecs = spanSecs;
}
ScheduledThreadPoolExecutor task = new ScheduledThreadPoolExecutor(1, new TaskThreadFactory(taskName));
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
task.scheduleAtFixedRate(runnable, delaySecs, spanSecs, TimeUnit.SECONDS);
return task;
}
/**
* 功能描述: 间隔定时执行
*/
public static ScheduledThreadPoolExecutor scheduleAtFixedRate(Runnable runnable, long spanSecs, String taskName) {
return scheduleAtFixedRate(runnable, spanSecs, spanSecs, taskName);
}
/**
* 功能描述: 每天定时执行
*/
public static ScheduledThreadPoolExecutor scheduleEveryDayAtTime(Runnable runnable, LocalTime time, String taskName) {
long secs = time.toSecondOfDay() - LocalTime.now().toSecondOfDay();
if (secs < 0) {
secs += TimeUnit.DAYS.toSeconds(1);
}
return scheduleAtFixedRate(runnable, secs, TimeUnit.DAYS.toSeconds(1), taskName);
}
}
调用的时候可以使用定时运行:
ScheduledThreadPoolExecutor queue = MyScheduleUtils.scheduleAtFixedRate(() -> 具体的方法名, 延时时间,秒, "队列名称");
或者定时运行(例:凌晨两点运行):
ScheduledThreadPoolExecutor task = AppScheduleUtils.scheduleEveryDayAtTime(
() -> ApplicationContextHolder.getContext().getBean(xxx.class).方法(),LocalTime.of(2,0,0),"task");