定時調度器主要是負責一些定時任務的調度,
public class CronTaskPool {
/**
* 執行任務的線程池
*/
private Executor executor;
/**
* 調度任務的線程池
*/
private ScheduledExecutorService scheduled;
private CronTaskPool() {
}
public static CronTaskPool newCornTaskPool(int poolSize, String poolName) {
CronTaskPool taskPool = new CronTaskPool();
taskPool.executor = ThreadPools.newFixedThreadPool(poolName, poolSize);
taskPool.scheduled = ThreadPools.newSingleThreadScheduledExecutor("scheduled-" + poolName);
return taskPool;
}
/**
* 收到任務后計算距離下一次執行的時間,提交至ScheduledExecutorService中
*/
public void submit(CronTask cronTask) {
scheduled.schedule(() -> safeExec(cronTask), getNextDelay(cronTask.getCron()),
TimeUnit.MILLISECONDS);
}
/**
* 將Cron中的任務提交至Executor執行,生成下一個任務
*/
private void safeExec(CronTask cronTask) {
try {
executor.execute(cronTask.getRunnable());
submit(cronTask);
} catch (Exception e) {
}
}
/**
* 計算當前時間距離下次執行的間隔
*/
private long getNextDelay(CronSequenceGenerator corn) {
return corn.next(new Date()).getTime() - System.currentTimeMillis();
}
private static void safeSleep(int seconds) {
try {
Thread.sleep(1000L * seconds);
} catch (Throwable t) {
}
}
public static void main(String[] args) {
CronTaskPool taskPool = CronTaskPool.newCornTaskPool(1, "test");
taskPool.submit(new CronTask() {
@Override
public Runnable getRunnable() {
return () -> System.out.println(System.currentTimeMillis());
}
@Override
public CronSequenceGenerator getCron() {
return new CronSequenceGenerator("*/5 * * * * ?");
}
});
safeSleep(100);
}
}
public interface CronTask {
/**
* 要被定時調度的任務
*/
Runnable getRunnable();
/**
* 任務調度的頻率,該類存在于org.springframework.scheduling.support.CronSequenceGenerator
* 接受一個cron表達式
*/
CronSequenceGenerator getCron();
}