线程池七大参数  核心线程数,最大线程数,任务队列,超时时间,时间单位,线程工厂,拒绝策略

线程池执行流程 :

添加一个任务到线程池  ->  判断当前线程数量是否大于核心线程数  ,如果不大于,创建新线程执行任务,将线程添加到线程池中 。

                     如果大于 -> 判断任务队列是否满,如果不满,将任务加入任务队列等待核心线程执行 ,

                     如果满了 -> 判断当前线程数量是否小于最大线程数,如果小于 创建新线程执行任务,并将线程加入线程池

                     如果当前线程数等于 最大线程数, 执行拒绝策略

android timer 线程池 线程池 keepalivetime=0_线程池

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  方法