Files
hutool/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java
2020-05-28 01:16:42 +08:00

83 lines
1.8 KiB
Java

package cn.hutool.cache;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 全局缓存清理定时器池,用于在需要过期支持的缓存对象中超时任务池
*
* @author looly
*/
public enum GlobalPruneTimer {
/**
* 单例对象
*/
INSTANCE;
/**
* 缓存任务计数
*/
private final AtomicInteger cacheTaskNumber = new AtomicInteger(1);
/**
* 定时器
*/
private ScheduledExecutorService pruneTimer;
/**
* 构造
*/
GlobalPruneTimer() {
create();
}
/**
* 启动定时任务
*
* @param task 任务
* @param delay 周期
* @return {@link ScheduledFuture}对象,可手动取消此任务
*/
public ScheduledFuture<?> schedule(Runnable task, long delay) {
return this.pruneTimer.scheduleAtFixedRate(task, delay, delay, TimeUnit.MILLISECONDS);
}
/**
* 创建定时器
*/
public void create() {
if (null != pruneTimer) {
shutdownNow();
}
this.pruneTimer = new ScheduledThreadPoolExecutor(1, r -> ThreadUtil.newThread(r, StrUtil.format("Pure-Timer-{}", cacheTaskNumber.getAndIncrement())));
}
/**
* 销毁全局定时器
*/
public void shutdown() {
if (null != pruneTimer) {
pruneTimer.shutdown();
}
}
/**
* 销毁全局定时器
*
* @return 销毁时未被执行的任务列表
*/
public List<Runnable> shutdownNow() {
if (null != pruneTimer) {
return pruneTimer.shutdownNow();
}
return null;
}
}