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