说一说newScheduledThreadPool工作原理
线程池特点:
- 最大线程数为Integer.MAX_VALUE,也有OOM的风险
- 阻塞队列是DelayedWorkQueue
- keepAliveTime为0
- scheduleAtFixedRate() :按某种速率周期执行
- scheduleWithFixedDelay():在某个延迟后执行
工作流程:
- 线程从DelayQueue中获取已到期的ScheduledFutureTask(DelayQueue.take())。到期任务是指ScheduledFutureTask的time大于等于当前时间。
- 线程执行这个ScheduledFutureTask。
- 线程修改ScheduledFutureTask的time变量为下次将要被执行的时间。
- 线程把这个修改time之后的ScheduledFutureTask放回DelayQueue中(DelayQueue.add())。
使用场景:
周期性执行任务的场景,需要限制线程数量的场景。
import java.util.concurrent.*;
/**
* @author 百里
*/
public class BaiLiScheduledThreadPoolDemo {
public static void main(string[] args) throws Exception {
// 创建一个可以执行定时任务的线程池
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// 调度一个定时任务,每隔 2 秒钟输出一次当前时间
ScheduledFuture<?> scheduledFuture = executorService.scheduleAtFixedRate(() -> {
System.out.println("Current time: " + System.currentTimeMillis());
}, 0, 2, TimeUnit.SECONDS);
// 主线程休眠 10 秒钟后取消任务
Thread.sleep(10000);
scheduledFuture.cancel(true);
// 关闭线程池
executorService.shutdown();
}
}
import java.util.concurrent.*;
/**
* @author 百里
*/
public class BaiLiScheduleWithFixedDelayDemo {
public static void main(String[] args) throws Exception {
// 创建一个可以执行定时任务的线程池
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// 调度一个周期性任务,每次任务执行完毕后等待 2 秒钟再执行下一个任务
executorService.scheduleWithFixedDelay(() -> {
System.out.println("Current time: " + System.currentTimeMillis());
}, 0, 2, TimeUnit.SECONDS);
// 主线程休眠 10 秒钟后关闭线程池
Thread.sleep(10000);
executorService.shutdown();
}
}