我是靠谱客的博主 完美柠檬,最近开发中收集的这篇文章主要介绍【多线程】线程池核心类-ThreadPoolExecutor前言参数讲解提供的启动和停止任务的方法提供的适用于监控的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
前言
ThreadPoolExecutor有很多构造函数,我们就摘要一个参数最多的那个方法来讲解
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
参数讲解
1、首先我们介绍一下corePoolSize、maximumPoolSize、workQueue这是三个入参
- corePoolSize:核心线程数量
- maximumPoolSize:最大线程数
- workQueue:阻塞队列,存储等待执行的任务,这个参数很重要,后面我们再讲
这三者关系:
- 如果运行的线程小于corePoolSize,就会直接创建新线程处理任务,即使线程池中的其他线程都是空闲的
- 如果运行的线程大于等于corePoolSize,并且小于maximumPoolSize,那这个时候,只要workQueue满了的时候,才会创建新的线程来处理任务
- 如果设置的corePoolSize=maximumPoolSize,那线程池的大小就是固定的,如果这个时候,有新任务提交并且workQueue没有满的话,就会把请求放在workQueue中,等待空闲的线程,然后从workQueue中取出任务进行处理
- 如果运行的线程数量大于maximumPoolSize,同时workQueue已经满了,就会通过拒绝策略参数handler来制定处理策略
1.1、这三个参数对任务进行如下的处理方式:
当提交一个新的任务到线程池中的时候,线程池会根据当前线程池中正在运行的线程数量来决定该任务的处理方式,处理方式主要是:直接切换、使用无限队列、使用有界队列
- 直接切换:常用的队列是SynchronousQueue
- 使用无限队列就是使用基于链表的队列,比如LinkedBlockingQueue,在这种方式下,线程池中的最大线程数就是corePoolSize,此时maximumPoolSize就没有作用了,当线程池中的所有线程都运行并提交任务了,就会放入等待队列中
- 使用有界队列是ArrayBlockingQueue,在这个方式下,可以将线程池的最大线程数量限制为maximumPoolSize,这样可以达到低消耗,的那是这种方式有一定的困难,就是线程池对线程的调度会很困难,所以线程池和队列的容量都是有限的了
1.2、通过这三个参数,来降低系统资源消耗:
- 如果想低耗,可以设置一个较大的队列容量和较小的线城市容量,这样的话会降低线程处理任务的吞吐量
- 如果提交的任务经常阻塞,可以条用设置最大线程数的方法,重新设置线程池最大线程数
- 如果队列的容量较小,一般情况下就需要把线程池的容量设置的大一点,这样的话,CPU的使用率就会高一些
- 如果线程池的容量比较大,并发量就会增加,就需要考虑线程调度的问题,反而可能会降低处理任务的吞吐量
2、其他入参:keepAliveTime、unit、threadFactory、handler
- keepAliveTime:线程没有任务执行时最多保持多久时间才终止,当线程池中的线程数量大于corePoolSize的时候,没有新的任务提交,那核心线程外的线程不会立马销毁, 而是等待一段时间,如果时间超过了keepAliveTime设置的时间,就会自动销毁
- unit:keepAliveTime的时间单位
- threadFactory:线程工厂,用来创建线程 默认会提供一个默认的工厂来创建线程,当使用默认的工厂来创建线程时,会使新创建的线程具有相同的优先级,并且是非守护的 线程,同时也设置了线程的名称
- handler:拒绝处理任务时的策略,如果workQueue阻塞队列满了,并且没有空闲的线程池,此时,继续提交任务,需要采取一种策略来处理这个任务。
3、handler提供的四种策略
- AbortPolicy:直接抛出异常,默认配置
- CallerRunsPolicy:用调用者所在的线程来执行任务
- DiscardOldestPolicy:丢弃队列中最靠前的任务并执行当前任务
- DiscardPolicy:直接丢弃当前任务
提供的启动和停止任务的方法
- execute():提交任务,交给线程池执行
- submit():提交任务,能够返回执行结果 execute+Future
- shutdown():关闭线程池,等待任务都执行完
- shutdownNow():立即关闭线程池,不等待任务执行完
提供的适用于监控的方法
- getTaskCount():线程池已执行和未执行的任务总数
- getCompletedTaskCount():已完成的任务数量
- getPoolSize():线程池当前的线程数量
- getCorePoolSize():线程池核心线程数
- getActiveCount():当前线程池中正在执行任务的线程数量
最后
以上就是完美柠檬为你收集整理的【多线程】线程池核心类-ThreadPoolExecutor前言参数讲解提供的启动和停止任务的方法提供的适用于监控的方法的全部内容,希望文章能够帮你解决【多线程】线程池核心类-ThreadPoolExecutor前言参数讲解提供的启动和停止任务的方法提供的适用于监控的方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复