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

线程池执行流程 :

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

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

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

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

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

                  

                    

原文地址:http://www.cnblogs.com/haodongshuai/p/16787392.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性