从场景上说明为什么要使用线程池,线程池处理提交任务的流程是什么,线程池的的运行原理是什么

场景:服务端的程序经常会遇到来自客户端传入的短小的任务,执行时间短暂,工作内容单一,并且需要快速的返回结果,如果服务器每次接收一个任务创建一个线程,然后进行执行,这在任务少的时候不错,如果有成千上万的任务递交给服务器,服务器将会创建成千上万的线程,创建成千上万的线程将会带给服务器巨大的压力,大量线程频繁的切换上下文将增加系统的负载和大量资源的开销,同时创建的线程也不方便管理,通过线程池技术可以很好的解决这个问题,预先创建若干线程,并且将线程的创建控制权交给线程池,重复使用线程,减小了服务器的压力,降低了资源的开销和使用,降低了系统的负载,提高相应速度,方便管理线程进行统一的分配调优和监控。
提交一个新的任务到线程池的时候,线程池的处理流程是:
1.线程池首先判断核心线程池中的线程是都在执行任务(核心线程池是否已经满了),如果不是,创建一个新的工作线程来执行任务,如果都在执行任务则进入下一个流程
2.线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在工作队列里,如果工作队列已经满了,则进入写一个流程中
3.线程池判断线程池中的线程是否都处于工作状态(线程池是否已经满了),如果没有则创建一个新的工作线程来执行任务,如果已经满了则交给包和策略处理这个任务
客户端通过执行execute(job)方法将job提交到线程池 中执行,而客户端自身不用等待job执行完成,线程池中还有增加和减少工作者线程,关闭线程池的方法,工作者线程是一个重复执行job的线程,而每个由客户端提交的job都将进入一个工作队列中等待工作者线程处理
ThreadPoolExecuteor执行execute()方法分为4种情况
1.如果核心线程池中当前运行的线程少于corePoolSize ,将创建一个新的线程来执行任务(需要获得全局锁)
2.如果核心线程池中当前运行的线程等于或者是多于corePoolSize则将任务加入BlockingQueue
3.如果BlockingQueue队列已经满了,则创建新的线程来处理任务(需要获得全局锁)
4.如果线程池中当前运行的线程超过了最大线程数,则交给饱和策略处理,拒绝执行任务并调用rejectedExecution()方法
客户端将提交一个任务交给线程池的处理流程对应的就是TreadPoolExecutor执行execute()方法的过程
ThreadPoolExecutor采取上述步骤的实际思路是为了在执行execute()方法的时候尽可能的避免获取全局锁。在ThreadPoolExecutor完成预热之后(当前核心线程池中的线程数目大于等于corePoolSzie)几乎所有调用execute()的方法都是在执行将任务添加到BlockingQueue中,因为这样的话不需要获取全局锁。实际上是没有核心线程的,核心线程池是线程池中的一部分,只要判断当前运行的线程的数目是否大于核心线程池的数目就可以。
工作线程:线程池创建线程的时候,会将线程封装称为工作者线程worker,在工作者线程执行完后,还会循环获取工作队列中的任务来执行。线程池中的线程执行任务分为 两种情况,在execute方法中创建一个线程,会让这个线程执行当前任务,这个新城执行完任务之后,会反复的从阻塞队列中获取任务来执行。
https://blog.csdn.net/holmofy/article/details/77411854

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值