Java线程池的执行流程

一、线程池:在线程池的使用过程中,根据提交的线程任务不断的进行创建线程,并且将这些线程按照创建时传入的不同配置参数进行管理。

二、线程池的优点:当线程使用完时不会销毁,而让其进入空闲状态,继续等待下一个线程任务,资源消耗小。

三、线程池的执行流程:

配置参数:

1、corePoolSize:核心线程数,线程池中最少线程,核心线程不会被回收。

2、maximumPoolSize:最大线程数,线程池中最多线程,包含核心线程数,不能小于核心线程数。

3、keepAliveTime:非核心线程(除去核心线程之外的线程)存活时间,如果非核心线程的空闲时间大于此参数,将会被回收。

4、TimeUnit:时间单位,参数keepAliveTime的时间单位。

5、BlockingQueue:阻塞工作队列,当来一个新的线程任务时,如果当前没有空闲线程,此线程任务将会进入阻塞工作队列中进行等待。

6、ThreadFactory:线程工厂,用于创建线程,自定义线程的名称。(需要实现ThreadFactory接口,实现newThread()方法,在此方法中,新建Thread对象,通过调用setName()方法给线程定义名称。)

7、RejectedExecutionHandler:拒绝策略,当线程池中没有空闲线程,且阻塞工作队列已满,且最大线程数也已超出,此时再来线程任务将执行拒绝策略。

有四种拒绝策略:第一种:AbortPolicy,丢弃任务并且抛出异常(默认方式)。第二种:DiscardPolicy,丢弃任务不抛异常。第三种:DiscardOldestPolicy,将阻塞工作队列中的队头任务丢弃,将当前任务加入阻塞工作队列。第四种:CallerRunsPolicy,谁调用谁处理。

执行流程:

1、当线程池创建好后提交一个新的线程任务时,会先为其分配空闲线程,然后执行线程任务。

2、当为新的线程任务分配空闲线程,但是没有空闲线程时,会判断当前"存活线程"是否超出核心线程数。

如果没有超出,就新创建一个核心线程,并为其分配当前线程任务,然后执行线程任务。

如果超出,就判断工作队列。如果工作队列没有满,就将当前任务放入工作队列中,当出现空闲线程时,从工作队列的队头中按照"先进先出"得规则取出1个线程任务,然后执行。

如果工作队列已满,判断"存活线程"是否达到最大线程数。如果没有超出最大线程数,就创建一个非核心线程执行线程任务。如果超出最大线程数,就执行拒绝策略。

四、线程池的状态

1、RUNNING:运行状态,线程池一被创建就进入RUNNING状态,此时,线程池中的线程数为0。当有线程任务进入时才会创建线程,然后执行线程。

2、SHUTDOWN:关闭状态,当调用shutdown()方法时,线程池进入SHUTDOWN状态,此时,线程池不会再接收新的线程任务,并且等待所有的线程任务执行完毕。

3、STOP:停止状态,当调用shutdownnow()方法时,线程池进入STOP状态,此时,线程池不会再接收新的线程任务,但是,线程池不会等待没有执行完的线程任务执行完,但是会将没执行完的线程任务返回。

4、TIDYING:整理状态,工作队列为空,且线程池中也没有线程任务,terminated()执行完毕,此时进入TIDYING状态。

5、TERMINATED:终止状态,此时表明线程池被完全关闭。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值