线程池七大参数 核心线程数,最大线程数,任务队列,超时时间,时间单位,线程工厂,拒绝策略
线程池执行流程 :
添加一个任务到线程池 -> 判断当前线程数量是否大于核心线程数 ,如果不大于,创建新线程执行任务,将线程添加到线程池中 。
如果大于 -> 判断任务队列是否满,如果不满,将任务加入任务队列等待核心线程执行 ,
如果满了 -> 判断当前线程数量是否小于最大线程数,如果小于 创建新线程执行任务,并将线程加入线程池
如果当前线程数等于 最大线程数, 执行拒绝策略
keepAliveTime 非核心线程存活时间,标记非核心线程空闲多久后被干掉
首先明确 一个概念,并没有标记哪条线程是核心线程,哪条线程是非核心线程。 并且也不会创建一条线程去检测现有线程来实现超时杀掉
线程池中,线程会一直扫描工作队列,去工作队列中拿任务,然后去执行,工作队列中拿任务有两种方式 take() ,poll()
take() 当工作队列不存在的时候会阻塞,直到工作队列中有任务解除阻塞,拿到队头任务去执行并移除。
keepAliveTime ,如果超时后还不能从队列中拿到任务,就会返回 null 作为提示,此时线程任务就会释放当前线程,干掉
那么此时就需要判断什么时候执行 take() 什么时候执行 poll ,很明显,当 现有线程大于 核心线程时会调用 poll ,
boolean= allowCoreThreadTimeOut || wc > corePoolSize;
allowCoreThreadTimeOut 是否允许核心线程超时销毁,此处可以忽略
如果不小于,那么就执行 take()会将线程阻塞,达到保护线程不死的目的。
那么poll 方法 是如何实现超时检测的 ?
available.awaitNanos(nanos) 一旦返回 超时 ,就返回 null , nanos 是超时时间 就是此时的 keepAliveTime , available.awaitNanos() 下面调用 native 方法