Java自带的定时类
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
源码分析:
- ScheduledThreadPoolExecutor构造方法最终调用的是ThreadPoolExecutor构造方法
- 阻塞队列使用的是DelayedWorkQueue
scheduleAtFixedRate()为固定频率,scheduleWithFixedDelay()为固定延迟。固定频率是相对于任务执行的开始时间,而固定延迟是相对于任务执行的结束时间,这就是他们最根本的区别!
模拟库存消耗
public class RedisUtils {
private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
// 自定义线程池大小 使用hutool开源包中的ThreadUtil工具类命名线程名前缀
//private static ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1, ThreadUtil.newNamedThreadFactory("gateway route refresh thread-", true));
private AtomicInteger stock = new AtomicInteger(0);
public RedisUtils() {
scheduledExecutorService.scheduleAtFixedRate(() -> {
// 模拟库存消耗
stock.addAndGet(1);
}, 0, 100000, TimeUnit.MICROSECONDS);
}
public int getStockUsed() {
return stock.get();
}
}