线程池

重要--深入详解Java线程池——ThreadPoolExecutor

https://my.oschina.net/ProgramerLife/blog/1811255

重要--Executor框架详解(Executor框架结构与框架成员)

https://blog.csdn.net/tongdanping/article/details/79604637

重要--java并发编程:Executor、Executors、ExecutorService

https://blog.csdn.net/weixin_40304387/article/details/80508236

重要--面试系列-线程池详解

https://yq.aliyun.com/articles/655502?spm=a2c4e.11153940.0.0.f4856693bFeAVk

重要--深入详解Java线程池——ThreadPoolExecutor  详细解释了各参数的意义

https://yq.aliyun.com/articles/633780?spm=a2c4e.11153940.0.0.f4856693bFeAVk

重要--合理配置线程池

https://www.cnblogs.com/toov5/p/9836217.html

 

重要--Java 8系列之重新认识HashMap

https://cloud.tencent.com/developer/article/1343130

 

云栖社区-深入详解Java线程池——Executor框架

https://yq.aliyun.com/articles/633782?utm_content=m_1000015330

Java--死锁以及死锁的排查

https://cloud.tencent.com/developer/article/1347601

使用Executors类创建线程池的弊端以及与使用ThreadPoolExecutor类的区别

https://blog.csdn.net/SmallCarrot/article/details/85013098

 

 

 

线程-- ThreadPoolExecutor

线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

        ThreadPoolExecutorExecutor接口的一个重要的实现类,是线程池的具体实现,用来执行被提交的任务。

        工作者线程的任务很简单:从工作队列中获取一个任务并执行任务,然后返回线程池等待下一个任务。线程池启动初期线程不会启动,有任务提交(调用executesubmit)才会启动,直到到达最大数量就不再创建而是进入阻塞队列。

ThreadPoolExecutor定义了很多构造函数,以其中一个为例:

public ThreadPoolExecutor(int corePoolSize,

      int maximumPoolSize,

      long keepAliveTime,

      TimeUnit unit,

      BlockingQueue<Runnable> workQueue,

      ThreadFactory threadFactory,

      RejectedExecutionHandler handler)

1corePoolSize:必需参数,线程池中所保存的核心线程数,包括空闲线程。在创建了线程池之后,默认情况下线程池中没有任何线程提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池核心线程数时就不再创建。

2maximumPoolSize:必需参数,线程池中允许的最大线程数,这个参数表示了线程池中最多能创建的线程数量,当任务数量比corePoolSize大时,任务添加到workQueue,当workQueue满了,将继续创建线程以处理任务,maximumPoolSize表示的就是wordQueue满了,线程池中最多可以创建的线程数量

3keepAliveTime必需参数,线程池中的空闲线程所能持续的最长时间。当线程池中的线程数大于corePoolSize时,keepAliveTime为多余的空闲线程等待新任务的最长时间,超过这个时间后多余的线程将被终止

4unit:必需参数, keepAliveTime持续时间单位。天、小时、分钟、秒、毫秒、微秒、纳秒。

5workQueue:必需参数,任务执行前保存等待执行任务队列

 

6threadFactory必需参数不设置此参数会采用内置默认参数defaultThreadFactory()方法创建属于同一个ThreadGroup对象的基本线程对象。也可以自己定义线程工厂,重新实现ThreadFactorynewThread Runnable)方法,设置属性.

7handler必需参数不设置此参数会采用内置默认参数,设置饱和策略,当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。

RejectedExecutionHandler 的实现类在ThreadPoolExecutor中有四个静态内部类,这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。共有4策略:包括AbortPolicy(丢弃任务并抛出RejectedExecutionException异常)、 DiscardPolicy(丢弃任务,但是不抛出异常DiscardOldestPolicy(丢弃执行队列中最老的任务,尝试为当前提交的任务腾出位置) CallerRunsPolicy调用者所在线程来运行任务)。可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。

 

当试图将个任务添加到线程池中时,按照如下顺序来处理:

1、如果线程池中的线程数量少于corePoolSize,即使线程池中有空闲线程,也会创建一个新的线程来执行新添加的任务;

2、如果线程池中的线程数量大于等于corePoolSize,但缓冲队列workQueue未满,则将新添加的任务放到workQueue中,按照FIFO的原则依次等待执行(线程池中有线程空闲出来后依次将缓冲队列中的任务交付给空闲的线程执行);

3、如果线程池中的线程数量大于等于corePoolSize,且缓冲队列workQueue已满,但线程池中的线程数量小于maximumPoolSize,则会创建新的线程来处理被添加的任务;

4、如果线程池中的线程数量等于了maximumPoolSize,有4处理方式。

总结起来,也即是

     有新的任务要处理时,先看线程池中的线程数量是否大于corePoolSize,再看缓冲队列workQueue是否满,最后看线程池中的线程数量是否大于maximumPoolSize

    另外,当线程池中的线程数量大于corePoolSize时,如果里面有线程的空闲时间超过了keepAliveTime,就将其移除线程池,这样,可以动态地调整线程池中线程的数量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值