文章目录
- 1 概览
- 2 核心点
- 2.1 使用线程池的好处
- 2.2 如何创建线程池
- 2.3 线程池的参数
- 2.4 如何处理任务流程?
- 2.5 如何关闭线程池
- 2.6 拒绝策略
- 2.7 线程池满了,会怎样?
1 概览
2 核心点
2.1 使用线程池的好处
- 降低资源消耗:通过重复利用已经创建的线程,降低线程创建和销毁造成的资源消耗
- 提高响应速度:当任务到达时,任务不需要等待创建线程就能立即执行
- 统一进行线程管理:线程是稀缺资源,使用线程池可以进行统一分配、调优和监控
2.2 如何创建线程池
- 原始:ThreadPoolExecutor()
- newSingleThreadExecutor() 工作线程数目被限制为1。
- newCachedThreadPool(): 用来处理大量短时间工作任务的线程池。会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过60秒,则被终止并移除缓存;长时间闲置时,这种线程池,不会消耗什么资源。
- newFixedThreadPool(int nThreads): 重用指定数据的线程,任何时候最多有nThread个工作线程是活动的。如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建。以补足指定数目的线程。
- newScheduledTreadPool(int corePoolSize) : 进行定时或周期性的工作调度。
- newSingleScheduledThreadExecutor() : 创建单线程,可以进行定时或周期性的工作调度。
- newWorkStealingPool(int parallelism): 并行批量的处理任务,不保证处理顺序。
2.3 线程池的参数
- corePoolSize: 核心线程数
- maximumPoolSize: 线程池最大线程数
- keepAliveTime: 空闲线程存活时间
- unit: 空闲线程存活时间单位
- workQueue: 工作队列
- threadFactory: 线程工厂
- handler: 拒绝策略
2.4 如何处理任务流程?
2.5 如何关闭线程池
调用 shutdown或shutdownNow方法关闭线程池。
2.6 拒绝策略
- AbortPolicy: 终止策略,默认的拒绝策略。直接抛出RejectExecutionException。调用者可以捕获这个异常,然后根据需求编写代码。
- DiscardPolicy: 抛弃策略。什么都不做,直接抛弃被拒绝的任务。
- DiscardOldestPolicy: 抛弃最老策略。抛弃阻塞队列中最老的任务,相当于就是队列中下一个将要被执行的任务,然后重新提交被拒绝的任务。
- CallerRunPolicy: 调用者运行策略。将任务退回到调用者,己不抛弃任务也不抛出异常。
2.7 线程池满了,会怎样?
如果使用的是无界队列,会继续添加到队列中;如果使用的是有界队列,会根据最大线程数来增加线程数量,如果增加了线程数量还是处理不过来,就会使用拒绝策略。