初始线程池

一:使用线程的方法:
new Thread弊端
(1)每次new Thread新建对象,性能比较差。
(2)线程缺乏同一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或OOM
(3)缺少更多功能,如更多执行,定期执行,线程中断。
线程池:
(1)重用存在的线程,减少对象的创建,消亡的开销。性能更好。
(2)可以有效控制并发线程数量,提高系统资源的利用率,同时可以避免过多资源竞争,避免阻塞。
(3)提供定时执行,定期执行,单线程,并发数控制等功能。
二:线程池简介:
corePoolSize:核心线程数量。
maximumPoolSize:线程池中最多线程数。
workQueue:阻塞队列,存储等待执行的任务,很重要。
(1)当运行的线程数小于corePoolSize的时候,创建线程,即使线程池中的其他线程是空闲的。
(2)当运行的线程数大于等于corePoolSize的时候,同时小于maximumPoolSize。只有当阻塞队列是满了才创建新线程处理任务。
(3)当corePoolSize和maximumPoolSize数量相等的时候,那么就是一个大小固定的线程池。若新任务提交。那么首先判断阻塞队列是否满了,若没有满,加入阻塞队列,等待空闲线程处理。若满了通过拒绝策略来处理。
直接切换,使用有界队列或无界队列。直接切换常用的队列就是synchronizedqueue。使用无界队列一般使用LinkedBlockingQueue,那么maximumPoolSize就无效了。当线性过来的时候,若运行线程大于corePoolSize,那么直接放到等待队列。workQueue为有界队列。要想使线程池处理任务和吞吐率达到相对合理的范围,又想使线程调度相对简单,并且经可能较低线程池对资源的消耗,我们就需要合理设置corePoolSize和maximumPoolSize。我们可以设置一个较大的最大容量和较小的核心线程容量,这样降低线程处理吞吐量。若设置的最大线程量大,不能不考虑在高并发情况下线程调度。
keepAliveTime:线程池维护线程所允许的空闲时间。当核心线程执行完后不会马上销毁,而是线程没有任务需要执行时并且空闲状态维持keepAliveTime后终止。
rejuctHandler:拒绝策略。
AbortPolicy默认直接抛出异常。
CallerRunsPolicy用调用者所在的线程执行任务。
DiscardOldestPolicy丢弃队列中最靠前的任务并执行当前任务。
RejectHandler或者执行放弃执行。

猜你喜欢

转载自blog.csdn.net/u014172271/article/details/80330845