1. 创建线程池
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(corePoolSize);
- 核心线程数(corePoolSize):即使线程空闲也不会被回收,确保任务及时调度。
2. 提交任务的三种方式
(1) 延迟执行一次任务:schedule()
scheduler.schedule(
() -> System.out.println("Delayed task"),
delay,
TimeUnit.SECONDS
);
(2) 固定频率周期性执行:scheduleAtFixedRate()
scheduler.scheduleAtFixedRate(
() -> System.out.println("Fixed rate task"),
initialDelay,
period,
TimeUnit.SECONDS
);
- 特点:任务的执行间隔固定。若任务执行时间超过
period
,则下次任务会立即开始。
(3) 固定延迟周期性执行:scheduleWithFixedDelay()
scheduler.scheduleWithFixedDelay(
() -> System.out.println("Fixed delay task"),
initialDelay,
delay,
TimeUnit.SECONDS
);
- 特点:任务的间隔是“上一次任务结束”到“下一次任务开始”的时间。
3. 关闭线程池
scheduler.shutdown();
scheduler.shutdownNow();
newScheduledThreadPool
与对象方法
1. 示例:周期性更新共享对象
public class DataProcessor {
private volatile Data data;
public DataProcessor() {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(
this::refreshData,
0, 5, TimeUnit.SECONDS
);
}
private void refreshData() {
Data newData = loadDataFromDB();
synchronized (this) {
data = newData;
}
}
public synchronized Data getData() {
return data;
}
}