多线程--线程池

多线程--线程池

  1. 线程池是什么: 线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。
  2. 线程池带来的好处
    1. 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗
    2. 提高响应速度:任务到达时,无需等待线程创建即可立即执行
    3. 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控
    4. 提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行
  3. 线程池解决的问题
    1. 频繁申请/销毁资源和调度资源,将带来额外的消耗,可能会非常巨大
    2. 对资源无限申请缺少抑制手段,易引发系统资源耗尽的风险
    3. 系统无法合理管理内部的资源分布,会降低系统的稳定性、
  4. 几种常见的线程池及使用方法
    1. ThreadPoolExecutor
      1. 构造方法
        在这里插入图片描述
      2. 参数介绍:
        1. corePoolSize:线程池的核心池大小,线程池创建之后,线程池中的线程数为0,当任务过来就会创建一个线程去执行,直到线程数达到corePoolSize,这时若依旧有任务到来时,会把任务放入等待队列中。如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程
        2. maximumPoolSize:线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数
        3. keepAliveTiem:线程存活保持时间)当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数
        4. workQueue(任务队列,有默认值):用于传输和保存等待执行任务的阻塞队列
        5. threadFactory(线程工厂,有默认值):用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号)
        6. handler(线程饱和策略,有默认值):当线程池和队列都满了,再加入线程会执行此策略
      3. ThreadPoolExecutor执行过程
        在这里插入图片描述
    2. 缓存线程池(Executors.newCachedThreadPool();)
      1. 缓存线程池,缓存的线程默认存活60秒。线程的核心池corePoolSize大小为0,核心池最大为Integer.MAX_VALUE,阻塞队列使用的是SynchronousQueue。是一个直接提交的阻塞队列,他总会迫使线程池增加新的线程去执行新的任务。在没有任务执行时,当线程的空闲时间超过keepAliveTime(60秒),则工作线程将会终止被回收,当提交新任务时,如果没有空闲线程,则创建新线程执行任务,会导致一定的系统开销。如果同时又大量任务被提交,而且任务执行的时间不是特别快,那么线程池便会新增出等量的线程池处理任务,这很可能会很快耗尽系统的资源
      2. 创建使用案例
        在这里插入图片描述
    3. 单例线程池(Executors.newSingleThreadExecutor();)
      1. 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
      2. 创建使用案例
        在这里插入图片描述
    4. 可重用固定个数线程池(Executors.newFixedThreadPool(int nThreads))
      1. 创建一个可重用固定个数的线程池,以共享的无界队列方式来运行这些线程
      2. 案例图示
        在这里插入图片描述
    5. 定长线程池(ScheduledExecutorService ses = Executors.newScheduledThreadPool(int corePoolSize);)
      1. 创建一个定长线程池,支持定时及周期性任务执行
      2. 案例图示
        在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值