MST
星途 面试题库

面试题:Java中如何创建一个固定线程数量的线程池并执行周期性任务

请描述使用Java线程池相关类(如 Executors 、 ScheduledThreadPoolExecutor 等)创建一个固定线程数量为5的线程池,并安排一个任务每隔10秒执行一次的具体代码实现步骤和关键要点。
17.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 代码实现步骤
    • 导入必要的包
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();
}
  1. 关键要点
    • 线程池创建:使用Executors.newScheduledThreadPool(5)创建一个固定线程数量为5的ScheduledExecutorService线程池,newScheduledThreadPool方法返回一个ScheduledExecutorService实例,该实例可用于执行定时任务。
    • 任务调度scheduleAtFixedRate方法用于安排任务以固定的时间间隔执行。第一个参数是一个Runnable任务,定义了具体要执行的逻辑;第二个参数initialDelay为首次执行任务的延迟时间,这里设置为0表示立即执行;第三个参数period是任务执行的时间间隔,这里设置为10秒;最后一个参数unit指定时间的单位,这里是TimeUnit.SECONDS
    • 线程池关闭:程序结束时,需要正确关闭线程池。首先调用shutdown方法启动一个有序关闭,不再接受新任务,但会继续执行已提交的任务。然后使用awaitTermination方法等待线程池终止,如果等待超时,调用shutdownNow尝试停止所有正在执行的任务,并返回等待执行的任务列表。再次调用awaitTermination确保线程池完全终止,若仍超时则打印错误信息。同时,在等待过程中若线程被中断,也要正确处理中断并停止线程池。