线程池总结

一、线程池的工作原理:

    简单的说就是对于线程的管理,从功能上来说就是把线程的具体执行与线程的维护、统计、日志等工作解耦。

    举个例子,如果不使用线程池,每个任务就开启一个新的线程,那来N的线程就会开启N的线程,这样的系统资源、计算能力肯定支撑不了,同时也浪费系统资源(线程的创建、销毁都需要额外系统开销),所以就需要有个东西来管理下,即线程池。

    做些什么事情呢?比如正常情况下保持多少个线程开启(核心线程数);应对大量的任务建立个池子来缓存任务,等有空余线程了再从池子里面领任务(任务队列);当然了任务多到一定时候池子肯定装不下了,那么我们就临时开线程紧急应对下(最大线程数);根据墨菲定律,任务可能趋近于无穷大,那么临时帮忙的线程哥们也不够了...,那我们就立个规矩去安排这种情况怎么处理(拒绝处理策略);当任务完成的差不多的时候,就不需要临时帮忙的线程了,就要销毁线程到正常情况下的线程数,比如一分钟都没任务就可以销毁了(空闲线程的存活时间)。PS:好吧,临时工挺悲哀的。。。

 

二、相关JAVA类:

     1、ThreadPoolExecutor,线程池的类。

     2、Executors,创建的线程池的工厂工具类。

             主要涉及到以下接口:

                  (1)newFixedThreadPool,初始化一个指定线程数的线程池,换句话说能够控制并发数,大多数场景都使用这种;

                 (2)newCachedThreadPool,初始化一个可以缓存线程的线程池,默认缓存60s,核心线程数为0,最大线程数可达到Integer.MAX_VALUE;使用场景:对于大量短暂异步任务的程序来说,使用该线程池能够大大提高性能 

                  (3)newSingleThreadExecutor,初始化的线程池中只有一个线程,如果该线程异常结束,会重新创建一个新的线程继续执行任务,唯一的线程可以保证所提交任务的顺序执行。

                  (4)newScheduledThreadPool,初始化的线程池可以在指定的时间内周期性的执行所提交的任务,在实际的业务场景中可以使用该线程池定期的同步数据。

 

三、线程池大小的合理配置:

    业内比较通用的方法,具体可再根据机子性能、具体任务调整。

    一般需要根据任务的类型来配置线程池大小:

  如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 N(CPU核数)+1,减少线程上下文的切换

  如果是IO密集型任务,参考值可以设置为2*N(CPU核数)

 

四、线程池使用场景:

    1、消息通知、发邮件、记录日志等等;

    2、秒杀;    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值