线程池总结
线程池是一种使用预创建线程的集合来优化和管理线程使用的技术,以避免在请求时创建和销毁线程的开销。在Java中,线程池的核心实现是通过ThreadPoolExecutor类,它提供了执行提交任务的功能。
1.线程池的参数介绍
我们以jdk文档中的来详细介绍
-
-
-
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
创建一个新的
ThreadPoolExecutor
与给定的初始参数。参数
-
-
1.int corePoolSize
(核心线程数)即使空闲时仍保留在池中的线程数,除非设置 allowCoreThreadTimeOut
2.
int maximumPoolSize
(线程总数 包括核心线程数与非核心线程数)池中允许的最大线程数
3.long keepAliveTime
(非核心线程的最长摆烂时间)当线程数大于内核时,这是多余的空闲线程在终止前等待新任务的最大时间
4. TimeUnit unit
参数的时间单位
5. BlockingQueue<Runnable> workQueue
用于在执行任务之前使用的队列。 这个队列将仅保存execute
方法提交的Runnable
任务
先进后出队列模型
6.ThreadFactory threadFactory
执行程序创建新线程时使用的工厂
7. RejectedExecutionHandler handler
执行被阻止时使用的处理程序,因为达到线程限制和队列容量
以下为四种拒绝策略:
2.线程池的工作流程
当一个新任务提交到线程池时,线程池会按照以下流程处理任务:
-
核心线程检查:线程池首先检查核心线程池(corePoolSize)中是否有线程空闲。如果有空闲线程,就使用这些线程执行新任务。如果核心线程都在忙,则进入下一步。
-
任务队列检查:线程池会检查任务队列(workQueue)是否已满。如果队列未满,新提交的任务将被放入队列中等待执行。如果队列已满,则进入下一步。
-
最大线程数检查:线程池会检查当前运行的线程数是否小于最大线程数(maximumPoolSize)。如果小于,线程池会创建新的线程来执行任务。如果已达到或超过最大线程数,则任务将被拒绝,并执行拒绝策略(RejectedExecutionHandler)。
线程池有五种状态:RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED。可以通过shutdown()或shutdownNow()方法来关闭线程池。shutdown()方法会使线程池进入SHUTDOWN状态,只中断空闲线程;而shutdownNow()方法会使线程池进入STOP状态,中断所有线程
3.使用Executors创建常见的线程池
1newFixedThreadPool 创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待。适用于负载比较重的服务器,为了资源的合理利用,需要限制当前线程数量。
2.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。适用于并发执行大量短期的小任务,或者是负载较轻的服务器。