线程池 ThreadPoolExecutor
常用线程池
- newFixedThredaPool 固定线程数量的线程池,改线程池中的线程数量始终不变。当有一个新任务提交时,若有空闲线程,则立即执行,否则会被暂存到一个任务队列中
- newSingleThreadExecutor 只有一个线程的线程池
- newCachedThreadPool 可根据实际情况调整线程数量的线程池。若有空闲线程可以复用,则优先使用,否则创建新线程。执行完毕后返回线程池复用
- newSingleThreadScheduledExecutor & newScheduledThreadPool 在某个固定的延时之后执行或者周期性执行
自定义线程池
- corePoolSize 指定线程池中的线程数量
- maximumPoolSize 最大线程数量
- keepAliveTime 当线程数量超过 corepoolSize 时,多余的空闲线程存活时间
- unit keepAliveTime 时间单位
- workQueue 任务队列,被提交但尚未执行的任务
- threadFactory 线程工厂,一般使用默认
- handler 拒绝策略
内置拒绝策略
- AbortPolicy 直接抛出异常,阻止系统运行
- CallerRunsPolicy 只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务
- DiscardOledestPolicy 丢弃最老的一个请求,并再次尝试提交当前任务
- DiscardPolice 默默地丢弃无法处理的任务,不予任何处理
参数解释
参数workQueue指被提交但未执行的任务队列。
- 直接提交的队列:SynchronousQueue,该队列没有容量,每一个插入操作都要等待一个相应的删除操作。
- 有界队列:ArrayBlockingQueue,新任务提交,若线程池实际线程数小于corePoolSize,则会优先创建新线程,若大于corePoolSize,则会将新任务提交到等待队列,若队列已满,则在总线程数不大于maximumPoolSize的前提下,创建新的线程执行任务,若大于maximumPoolSize,则执行拒绝策略。
- 无界队列:LinkedBlockingQueue,提交新任务,如果当前线程小于corePoolSize,则新建线程,否则加入队列。若任务创建速度大于处理速度,无界队列会保持快速增长,直到耗尽系统资源。
- 优先队列:PriorityBlockingQueue.
赏
免费分享,随意打赏
发表评论