<span><span style="line-height: 1.45;">线程池的优点</span><span style="line-height: 1.45;"></span></span>
<span><span style="line-height: 1.45;">降低资源消耗:通过重复利用已经创建的线程降低线程创建和销毁造成的损耗</span><span style="line-height: 1.45;"></span></span>
<span><span style="line-height: 1.45;">提高效应速度:任务不需要等到线程创建就能立即执行</span><span style="line-height: 1.45;"></span></span>
<span><span style="line-height: 1.45;">提高线程的可管理性:线程池统一分配,调优和监控</span><span style="line-height: 1.45;"></span></span>
<span><span style="line-height: 1.45;">线程池接受新任务的流程</span></span><br>
<span><span style="line-height: 1.45;"><font color="#ffffff">(1)线程池判断核心线程池里面的线程是否都在执行任务</font></span></span><br>
NO:创建一个新的工作线程执行任务
<span><span style="line-height: 1.45;">YES:执行流程(2)</span></span><br>
<span><span style="line-height: 1.45;">(2)线程池判断工作队列是否满了</span></span><br>
NO:没有满,则将新提交的任务存储到工作队列中
YES;满了,进入(3)
<span><span style="line-height: 1.45;">(3)线程池判断线程池的线程是否都处于工作状态。</span></span><br>
<span><span style="line-height: 1.45;">NO:没有都处于工作状态,则创建一个新的工作线程来执行任务</span></span><br>
<span><span style="line-height: 1.45;">如果已经饱和了,则交给饱和策略来处理任务</span></span><br>
线程池的组成部分
<span><span style="line-height: 1.45;">管理器</span></span><br>
<span><span style="line-height: 1.45;">工作线程</span></span><br>
<span><span style="line-height: 1.45;">任务接口</span></span><br>
<span><span style="line-height: 1.45;">等待队列</span></span><br>
线程池的创建ThreadPoolExecutor的重要参数
1.corePoolSize:核心线程数(线程池的基本大小)
当提交一个新任务时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池的基本大小时就不在创建了。<br>
调用prestartCoreThread()方法会让线程池提前创建并启动所有线程
2.maximumPoolSize:线程池最大数量
如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务
如果使用了无界队列,那么这个参数就会失效
3.long keepAliveTime:线程活动保持时间
线程池的工作线程控线后,保持存活的时间
4.TimeUnit unit:线程保持存活时间的单位
5.BlockingQueue<Runnable> workQueue:任务队列
作用:用于保存等待执行的任务的阻塞队列
ArraBlockingQueue:基于数组结构的有界阻塞队列;按照FIFO先进先出的原则对元素进行排序
LinkedBlockingQueue:基于链表结构的无界阻塞队列;按照FIFO先进先出的原则对元素进行排序
Executors.newFixedThreadPool()以及Executors.newSingleThreadExecutor使用该队列
SynchronousQueue:一个不存储元素的有界阻塞队列;每个插入操作必须等待另一个线程的一处操作,否则插入操作会一直阻塞
Executors.newCachedThreadPool()
PriorityBlockingQueue:一个具有优先级的无限阻塞队列
DelayQueue封装了一个ProorityBlockingQueue
6.ThreadFactory threadFactory:用于设置线程工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字
7.RejectedExecutionHandler handler:饱和策略
当队列和线程池都已经满了,说明线程池饱和状态,必须采取一种策略处理提交的新任务。
AbortPolicy:直接抛出异常
CallerRunsPolicy:只用调用者所在线程来运行任务
DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务
DiscardPolicy:不处理,直接丢弃
<span><span style="line-height: 1.45;">线程池的其他操作</span></span><br>
线程池提交任务
execute:提交不需要返回值的任务
submit:提交需要返回值的任务
返回Future对象,Future.get()得到返回值
线程池的关闭
void shutdown():将线程池的状态设置为SHUTDOWN状态,然后中断所有没有正在执行任务的线程
List<Runnable> shutdownNow():将线程池的状态设置为STOP,然后尝试停止所有正在执行或者暂停任务的线程,并返回等待执行任务的列表
线程池的监控
taskCount:线程池所需要执行的任务数量
completedTaskCount:线程池再运行过程中已完成的任务数量
largestPoolSize:线程池里曾经创建过的最大线程数量,查看是否满过
getPoolSize:线程池的线程数量,线程池不晓辉的话,线程池的线程不会自动销毁,所以这个数字只增不减
getActiveCount:获取活动线程数量
beforeExecute:线程任务执行前
afterExecute:x线程任务执行后
terminated:线程池关闭前执行
<span><span style="line-height: 1.45;">Executors框架</span></span><br>
ThreadPoolExecutor
ExecutorService newFixedThreadPool(int nThreads):创建一个固定线程数量的线程池
为了满足资源管理的需求,需要限制当前线程数量的应用场景。适用于负载比较重的服务器
ExecutorService newSingleThreadExecutor():创建使用单个线程的线程池
需要保证顺序执行各个人物,并且在任意时间点上,不会有多个线程是活动的应用场景
ExecutorService newCachedThreadPool():创建一个会根据需要创建新线程的CacheThreadPool
CacheThreadPool是大小无界的线程池,适合于执行很多短期异步任务的小程序,或者负载较轻的服务器
ScheduledThreadPoolExecutor
ScheduledThreadPoolExecutor:包含若干线程 / SingleThreadScheduledExecutor:只包含一个线程
作用:用来在给定的延迟之后运行任务,或者顶起执行任务。
采用的队列为无界队列DelayQueue
ExecutorService
提交任务:submit()
拒绝新任务,等待任务全部结束关闭线程池shutdown()
尝试立刻关闭线程池并返回等待执行的任务列表List<Runnable> shutdownNow()
FutureTask
<span><span style="line-height: 1.45;">ExecutorService</span></span><br>