一、线程池:在线程池的使用过程中,根据提交的线程任务不断的进行创建线程,并且将这些线程按照创建时传入的不同配置参数进行管理。
二、线程池的优点:当线程使用完时不会销毁,而让其进入空闲状态,继续等待下一个线程任务,资源消耗小。
三、线程池的执行流程:
配置参数:
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:终止状态,此时表明线程池被完全关闭。