- 代码实现步骤:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
- **创建固定线程数量为5的线程池**:
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
- **安排任务每隔10秒执行一次**:
executorService.scheduleAtFixedRate(() -> {
// 这里是任务的具体逻辑
System.out.println("任务执行中...");
}, 0, 10, TimeUnit.SECONDS);
- **关闭线程池(通常在程序结束时执行)**:
executorService.shutdown();
try {
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
executorService.shutdownNow();
if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
System.err.println("Pool did not terminate");
}
}
} catch (InterruptedException ie) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
- 关键要点:
- 线程池创建:使用
Executors.newScheduledThreadPool(5)
创建一个固定线程数量为5的ScheduledExecutorService
线程池,newScheduledThreadPool
方法返回一个ScheduledExecutorService
实例,该实例可用于执行定时任务。
- 任务调度:
scheduleAtFixedRate
方法用于安排任务以固定的时间间隔执行。第一个参数是一个Runnable
任务,定义了具体要执行的逻辑;第二个参数initialDelay
为首次执行任务的延迟时间,这里设置为0表示立即执行;第三个参数period
是任务执行的时间间隔,这里设置为10秒;最后一个参数unit
指定时间的单位,这里是TimeUnit.SECONDS
。
- 线程池关闭:程序结束时,需要正确关闭线程池。首先调用
shutdown
方法启动一个有序关闭,不再接受新任务,但会继续执行已提交的任务。然后使用awaitTermination
方法等待线程池终止,如果等待超时,调用shutdownNow
尝试停止所有正在执行的任务,并返回等待执行的任务列表。再次调用awaitTermination
确保线程池完全终止,若仍超时则打印错误信息。同时,在等待过程中若线程被中断,也要正确处理中断并停止线程池。