[Java-juc] 线程池
2026年3月31日大约 3 分钟
[Java-juc] 线程池
重点- 什么是线程池?
线程池是用来管理和复用线程的工具,可以减少创建和销毁线程的开销。
- TreadPoolExecutor是核心线程池实现类。通过核心线程数、最大线程数、任务队列和拒绝策略控制线程的创建和执行。
线程池里面的任务队列是什么队列?
阻塞队列。
重点- 说一下线程池的工作流程?
// 任务提交 -> 核心线程执行 -> 任务队列 -> 非核心线程执行 -> 拒绝策略- 使用
submit()方法提交任务给线程池。 - 线程池创建核心线程执行任务。
- 当核心线程已满,任务放入线程队列等待执行。
- 当任务队列已满,而线程数量为未达到最大线程数,线程池会创建非核心线程池执行任务。
- 当任务队列已满,且线程数达到最大数量时,线程池会执行拒绝策略。
重点- 线程池的主要参数有哪些?
corePoolSize:核心线程数,线程池始终保持的线程数量。maximumPoolSize:最大线程数,线程池中允许的最大线程数量。workQueue:任务队列,存储等待执行的任务。handler:拒绝策略,当线程池无法处理新任务时执行的策略。ThreadFactory:线程工厂,用于创建新线程。keepAliveTime:非核心线程的存活时间,当空闲时间超过该值则销毁unit:keepAliveTime 的时间单位。
能简单说一下参数之间的关系吗?
任务优先由核心线程执行,当核心线程满时,放入任务队列。
当任务队列满时,创建非核心队列执行。超过最大线程数,则执行拒绝策略。
非核心线程超过keepAliveTime指定时间后会被销毁。
核心线程数不够会怎么进行处理?
- 会线放入任务队列等待执行,当任务队列已满,创建非核心线程执行。当超过最大线程数,执行拒绝策略。
重点- 线程池的拒绝策略有哪些?
AbortPolicy:默认策略,抛出 RejectedExecutionException 异常。CallerRunsPolicy:让提交任务的线程执行该任务。DiscardPolicy:直接丢弃任务,不抛出异常。DiscardOldestPolicy:丢弃队列中最旧的任务,并尝试执行当前任务。- 自定义拒绝策略:实现 RejectedExecutionHandler 接口,定义自己的拒绝处理逻辑。
线程池有哪几种阻塞队列?
ArrayBlockingQueue:有界队列,基于数组的FIFO阻塞队列,适合固定大小的线程池。LinkedBlockingQueue:无界队列,底层是链表,大小默认为 Integer.MAX_VALUE,适合任务量大的线程池。ProrityBlockingQueue:支持优先级排序的无界阻塞队列。任务按照comparator排序。DelayQueue:延迟阻塞队列,二叉堆实现的无界队列。SynchronousQueue:无元素存储阻塞队列,每个插入操作必须等待另一个线程的移除操作。
线程池提交 execute 和 submit 有什么区别?
execute:无返回值。submit:有返回值。
线程池怎么关闭知道吗?
shutdown():不会立即关闭线程池,而是等待所有任务执行完成后关闭线程池。shutdownNow():关闭线程池,立即尝试停止所有正在执行的任务,是否关闭取决于线程的响应。
线程池的线程数应该怎么配置?
- CPU密集型:对于CPU密集型,应该减少CPU切换。将核心线程数设置为处理器核心数或其加1是比较合适的。
- IO密集型:对于IO密集型,经常需要等待IO操作。因此设置更多线程,如CPU核心数的两倍,来提高并发比较合适。
有哪几种常见的线程池?
在Executors类下主要有4种:
newFixedThreadPool:固定大小线程池newCachedThreadPool:缓存线程池newScheduledThreadPool:定期执行线程池newSignleThreadExecutor:单线程线程池
线程池用了哪些设计模式?
工厂模式、享元模式、生产者-消费者模式、模板方法模式