什么是线程:
线程池:提前创建好一批线程,放入一个池子里,每当有任务来的时候,从池子里取一个线程去执行任务,任务执行结束,线程回收到池子里。
常见线程池:
newFixedThreadPool: 创建固定线程数的线程池
newCachedThreadPool: 创建线程数目动态增长的线程池.
newSingleThreadExecutor: 创建只包含单个线程的线程池.
newScheduledThreadPool: 设定 延迟时间后执行命令,或者定期执行命令. 是进阶版的 Timer
线程池的主要参数:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
创建一个新 ThreadPoolExecutor给定的初始参数。
-----------(以公司来喻线程池)----------
corePoolSize:核心线程数(公司的正式工数量,一但录用就不会辞退)
maximumPoolSize:最大线程数(正式工与临时工的数量最大数量)
keepAliveTime:线程的空闲时间(临时工允许的空闲时间)
unit:时间单位
workQueue:传递任务的阻塞队列(公司的任务表)
threadFactory:创建线程的工厂:参与线程的创建工作(参与公司招工工作)
handler:拒绝策略( 如果任务量超出公司的负荷了接下来怎么处理)
AbortPolicy(): 超过负荷, 直接抛出异常.
CallerRunsPolicy(): 调用者负责处理
DiscardOldestPolicy(): 丢弃队列中最老的任务.
DiscardPolicy(): 丢弃新来的任务
线程池的工作流程:
最开始时候,线程池是空的(公司一个员工也没有)
随着任务的提交,线程开始创建:
(1)如果当前线程数<核心线程数:创建线程(正式工没有招满)
(2)如果当前线程数==核心线程数:把工作添加到任务队列(正式工招满了)
(3)如果任务队列满了,且当前线程数<最大线程数:创建线程(正式工忙不过来了,开始招临时工)
(4)如果队列满了,且当前线程数==最大线程数:执行拒绝策略(正式工和临时工都招满了而且任务忙不过来了)
随着任务不断执行,任务数量不断减少,开始有了空闲线程(任务不断减少,有些员工没事干了)
如果一个线程的空闲时间>大于线程池规定的空闲时间&&当前线程的数量>核心线程数:销毁线程,直到当前线程数==核心线程数