1. ScheduledThreadPoolExecutor 的使用
一段简单的代码例子
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
executor.schedule(() -> {
System.out.println("schedule task is running....");
return "schedule task done";
}, 10, TimeUnit.SECONDS);
System.out.println("main thread run here.");
executor.shutdown();
}
其运行结果如下:
main thread run here.
schedule task is running....
2. 源码分析
ScheduledExecutorService executor = Executors.newScheduledThreadPool(10); // 实际返回的便是 ScheduledThreadPoolExecutor
而 ScheduledThreadPoolExecutor 实际是 ThreadPoolExecutor 的子类,在其设计基础上扩展了定时能力,与 ThreadPoolExecutor 不同的是,ScheduledThreadPoolExecutor 内的 workQueue 采用的是 DelayedWorkQueue,一个 BlockingQueue 实现,但支持定时能力,内部实现更类似 DelayQueue。
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue());
}
接下来我们看核心逻辑,即schedule
方法的逻辑:
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
if (command == null || unit == null)
throw