当前位置:   article > 正文

java面试题整理《多线程篇》九_当核心线程满,且阻塞队列也满时,才会判断当前线程数是否小于最大线程数,才决

当核心线程满,且阻塞队列也满时,才会判断当前线程数是否小于最大线程数,才决

线程池的原理?
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。他的主要特点为:线程复用;控制最大并发数;管理线程。

重用存在的线程,减少对象创建销毁的开销,且提高了响应速度;有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞,且可以定时定期执行、单线程、并发数控制,配置任务过多任务后的拒绝策略等功能。

线程池类别:

newFixedThreadPool :一个定长线程池,可控制线程最大并发数。
newCachedThreadPool:一个可缓存线程池。
newSingleThreadExecutor:一个单线程化的线程池,用唯一的工作线程来执行任务。
newScheduledThreadPool:一个定长线程池,支持定时/周期性任务执行。
线程池尽量不要使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式去创建,因为Executors创建的线程池底层也是调用 ThreadPoolExecutor,只不过使用不同的参数、队列、拒绝策略等如果使用不当,会造成资源耗尽问题。直接使用ThreadPoolExecutor让使用者更加清楚线程池允许规则,常见参数的使用,避免风险。

主要参数:

corePoolSize:核心线程数,默认情况下创建的线程数,默认情况下核心线程会一直存活,是一个常驻线程。
maximumPoolSize:线程池维护线程的最大数量,超过将被阻塞!(当核心线程满,且阻塞队列也满时,才会判断当前线程数是否小于最大线程数,才决定是否创建新线程)
keepAliveTime:非核心线程的闲置超时时间,超过这个时间就会被回收,直到线程数量等于 corePoolSize。
unit:指定 keepAliveTime 的单位,如 TimeUnit.SECONDS、TimeUnit.MILLISECONDS
workQueue:线程池中的任务队列,常用的是 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。
threadFactory:创建新线程时使用的工厂
handler:RejectedExecutionHandler 是一个接口且只有一个方法,线程池中的数量大于 maximumPoolSize,对拒绝任务的处理策略,默认有 4 种策略:AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy
https://www.bilibili.com/video/BV1qL411u7eEicon-default.png?t=M666https://www.bilibili.com/video/BV1qL411u7eE

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/968480
推荐阅读
相关标签
  

闽ICP备14008679号