首页 > 其他分享 >线程池原理

线程池原理

时间:2023-01-23 14:22:05浏览次数:53  
标签:corePoolSize 创建 keepAliveTime 任务 线程 核心 原理

Java线程一对一映射为内核线程。
线程池可以复用线程,限制线程数量。

参数含义

public ThreadPoolExecutor(int corePoolSize,// 线程池核心线程数
                          int maximumPoolSize,// 线程池最大线程数
                          long keepAliveTime,// 当线程数大于核心线程数时,多余的空闲线程存活的最长时间
                          TimeUnit unit,// 时间单位
                          BlockingQueue<Runnable> workQueue,// 任务队列
                          ThreadFactory threadFactory,// 创建线程的线程工厂
                          RejectedExecutionHandler handler) // 任务过多时执行拒绝策略

线程池的线程分配流程

 

创建线程池后默认不创建线程

在创建完线程池之后,默认情况下,线程池中没有任何线程,等到有任务来才创建线程去执行任务。但有一种情况排除在外,调用prestartAllCoreThreads()或者prestartCoreThread()方法可以提前创建等于核心线程数的线程数量,即预热,常用于抢购系统。
线程池新建线程时,如果当前线程总数小于corePoolSize,则新建的是核心线程;如果超过corePoolSize,则新建的是非核心线程。

抛出RejectedExecutionException异常

当新提交的任务无法加入到等待队列且线程数量已经等于maximumPoolSize时,如果没有为线程池设置拒绝策略,那么线程池会抛出RejectedExecutionException异常,即线程池拒绝接受这个任务。

回收超过corePoolSize的多余空闲线程

针对非核心线程,当线程池中创建的线程数量超过设置的corePoolSize,如果多余的空闲非核心线程等待keepAliveTime时间后没有任务,那么这个线程会被回收。
针对核心线程,把allowCoreThreadTimeOut设置成true,包括核心线程在内没有任务执行的所有线程,在等待keepAliveTime时间后全部回收掉。

参考资料

18 | 如何设置线程池大小?

 

标签:corePoolSize,创建,keepAliveTime,任务,线程,核心,原理
From: https://www.cnblogs.com/WJQ2017/p/17065155.html

相关文章