线程池基本概念
线程池
线程池本质上是一种对象池,用于管理线程资源。在任务执行前,需要从线程池中拿出线程来执行。在任务执行完成之后,把线程放回线程池。实际开发中,线程资源一般通过线程池提供,比如处理数据库连接、接收网络请求。
- 线程的创建更加规范,可以合理控制开辟线程的数量。
- 不必频繁地创建和销毁线程,优化了资源的开销。
核心线程池
(corePool) 通常状况下,线程池最多能创建的线程数。
当有新任务等待处理时,线程池会首先判断核心线程池是否已满,如果没满则创建线程执行任务。即使有其他核心线程空闲也会创建新的核心线程来执行。
任务队列
(BlockQueue) 线程池中等待被线程执行的任务队列。
如果核心线程池已满,线程池会判断队列是否已满。如果队列没满,就会将任务放在队列中等待执行。
- ArrayBlockingQueue // 基于数组实现的阻塞队列,有界。
- LinkedBlockingQueue // 基于链表实现的阻塞队列,可以无界。
- SynchronousQueue // 不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作。
- PriorityBlockingQueue // 带优先级的阻塞队列,无界。
最大线程池
(maximumPool) 任务量很大时,线程池最多能创建的线程数。
如果队列已满,说明当前任务量已经非常大,仅靠核心线程池内的线程数量已无法处理。线程池会判断最大线程池是否已满,如果没满则创建更多线程,从等待队列首部取得任务并执行。
拒绝策略
(RejectedExecutionHandler) 线程池拒绝过量任务的方式。
如果最大线程池已满,表示当前服务器已无法处理这么多任务。任务会按照既定的拒绝策略被处理。
- CallerRunsPolicy // 在调用者线程执行。
- AbortPolicy // 直接抛出 RejectedExecutionException 异常。
- DiscardPolicy // (常用)任务直接丢弃,不做任何处理。
- DiscardOldestPolicy // 丢弃队列里最旧的那个任务,再尝试执行当前任务。