3.1 线程池的引出

线程的频繁创建和销毁、使用量特别大的资源,例如并发情况下的资源,频繁的操作对性能影响很大。
||
提前创建一个线程池,放入多个线程,使用时直接调用,使用完成后放回线程池。

3.2 线程池的优势

1、降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。
3、便于线程的统一管理:线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

3.3 线程池的创建

1、实例化实现类**ThreadPoolExector对象**,其中ThreadPoolExector类主要参数包括:

  1. - **corePoolSize(必需)**:核心线程数。默认情况下,核心线程会一直存活,但是当将 allowCoreThreadTimeout 设置为 true 时,核心线程也会超时回收。
  2. - **maximumPoolSize(必需)**:线程池所能容纳的最大线程数。当活跃线程数达到该数值后,后续的新任务将会阻塞。
  3. - **keepAliveTime(必需)**:线程闲置超时时长。如果超过该时长,非核心线程就会被回收。如果将 allowCoreThreadTimeout 设置为 true 时,核心线程也会超时回收。
  4. - **unit(必需)**:指定 keepAliveTime 参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。
  5. - **workQueue(必需**):任务队列。通过线程池的 execute() 方法提交的 Runnable 对象将存储在该参数中。其采用阻塞队列实现。
  6. - threadFactory(可选):线程工厂。用于指定为线程池创建新线程的方式。
  7. - handler(可选):拒绝策略。当达到最大线程数时需要执行的饱和策略。

2、常用的线程池创建方式(不推荐使用):

  1. - 定长线程池(FixedThreadPool
  2. - 定时线程池(ScheduledThreadPool
  3. - 可缓存线程池(CachedThreadPool
  4. - 单线程化线程池(SingleThreadExecutor

4、线程池问题 - 图1

3.4 线程池的工作原理