JAVA -- 线程池ThreadPoolExecutor

线程池的好处:

        其实每个线程都是为了完成某个业务功能任务,假设某个功能A任务,需要执行10000次,那么如果正常操作的话可能要创建10000次线程,每个线程去完成A任务,完成后这10000个线程再回收销毁。想想就知道这个有多浪费资源,线程是宝贵的资源,频繁的创建和销毁消耗的资源是很大的,而且很有可能创建和销毁资源的时间会超过业务执行的时间

        如过使用线程池,假设这线程池的大小为10个线程,那么这10个线程在创建后就会不断的去执行那10000个A任务,执行一个后不会销毁而是会继续执行下一个,这样10000个A任务执行完后,只销毁了10个创建线程的资源,所以线程池在节约资源上的作用显而易见

Java线程池ThreadPoolExecutor

        ThreadPoolExecutor的构造参数如下:

ThreadPoolExecutor(int corePoolSize,
                               int maximumPoolSize,
                               long keepAliveTime,
                               TimeUnit unit,
                               BlockingQueue<Runnable> workQueue,
                               RejectedExecutionHandler handler);

corePoolSize:线程池核心线程数量

maximumPoolSize:线程池最大线程数量

keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间

unit:存活时间的单位

workQueue:存放任务的队列

handler:超出线程范围和队列容量的任务的处理程序

线程池的粗略处理流程:

        假设这个线程池创建时,核心线程数是10,最大线程数是100

1:当第1~10个任务进来时,线程池会一个一个创建核心线程,最后10个核心线程被创建,这10个线程创建执行万任务后不会 被销毁,会从任务队列workQueue中获取下一个任务(获取不到就会阻塞,这里设计到阻塞队列的使用)

2:当第11~AA(并发承受范围内)个任务进来时,会保存到任务队列workQueue中,从而被核心线程获取,核心线程执行玩后再从队列中获取下一个任务,正常情况下,在并发量在承受范围内的时候,任务队列的进任务和出任务会保持平衡,任务队列不会被挤爆

3:当第AA~BB(并发太大,短时间承受不太住)个任务进来时,此时10个核心线程的处理任务速度比不上任务队列增加的速度,时间厂里任务队列就满了,这时候再有任务进来就会分配到临时线程中(90个),让临时线程去处理,来减缓核心线程和任务队列的压力,当高峰时间过去后,线程池压力回复正常,核心线程可以处理后,临时线程存活时间到了后还没有新的任务过来就会被回收销毁

4:当第BB~CC (并发极大,线程池撑不住了 )个任务进来时,这时候100个线程都处理不过来,一个空闲线程都没有,任务队列也是满的,这时候再进来一个任务,就会交给handler处理(可以自定义处理方式,一般是抛出异常,也可以等待,或者其他自定义操作)

以上的流程都是我粗浅的理解,部分内容可能与实际不符合,请看客们适当获取知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值