好公司网站建设,四川省建设网,空间刷赞网站推广,网站建设功能评估表线程池参数 线程池工作过程
当提交一个新任务到线程池时#xff0c;具体的执行流程如下#xff1a; 当我们提交任务#xff0c;线程池会根据corePoolSize大小创建若干任务数量线程执行任务 当任务的数量超过corePoolSize数量#xff0c;后续的任务将会进入阻塞队列阻塞排…线程池参数 线程池工作过程
当提交一个新任务到线程池时具体的执行流程如下 当我们提交任务线程池会根据corePoolSize大小创建若干任务数量线程执行任务 当任务的数量超过corePoolSize数量后续的任务将会进入阻塞队列阻塞排队 当阻塞队列也满了之后那么将会继续创建(maximumPoolSize-corePoolSize)个数量的线程来 执行任务如果任务处理完成maximumPoolSize-corePoolSize额外创建的线程等待
keepAliveTime之后被自动销毁
如果达到maximumPoolSize阻塞队列还是满的状态那么将根据不同的拒绝策略对应处理
创建线程池
《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建而是通过 ThreadPoolExecutor 的方式这样的处理方式让写的同学更加明确线程池的运行规则规避资源耗尽 的风险**
Executors 返回线程池对象的弊端如下 FixedThreadPool 和 SingleThreadExecutor 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求从而导致OOM。
CachedThreadPool 和 ScheduledThreadPool 允许创建的线程数量为 Integer.MAX_VALUE 可能会创建大量线程从而导致OOM。
方式一通过构造方法实现 方式二通过Executor 框架的工具类Executors来实现 我们可以创建三种类型的
ThreadPoolExecutor
FixedThreadPool 该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。 当有一个新的任务提交时线程池中若有空闲线程则立即执行。若没有则新的任务会被暂存在 一个任务队列中待有线程空闲时便处理在任务队列中的任务。
SingleThreadExecutor 方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程 池任务会被保存在一个任务队列中待线程空闲按先入先出的顺序执行队列中的任务。
CachedThreadPool 该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数 量不确定但若有空闲线程可以复用则会优先使用可复用的线程。若所有线程均在工作又有新 的任务提交则会创建新的线程处理任务。所有线程在当前任务执行完毕后将返回线程池进行复 用。 对应Executors工具类中的方法如图所示
拒绝策略
AbortPolicy直接丢弃任务抛出异常这是默认策略CallerRunsPolicy只用调用者所在的线程来处理任务DiscardOldestPolicy丢弃等待队列中最旧的任务并执行当前任务DiscardPolicy直接丢弃任务也不抛出异常