码迷,mamicode.com
首页 > 编程语言 > 详细

线程池的实现原理

时间:2017-08-17 17:18:36      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:分享   factory   dfa   队列   技术分享   阻塞队列   函数   线程池   actor   

技术分享

在ThreadPoolExecutor的构造方法中,定义了线程池的核心线程数,最大线程数,过期时间,时间单位,阻塞队列,创建线程的工厂,拒绝策略。下面来看看默认的线程工厂,它到底是如何创建新的线程的。

DefaultThreadFactory实现了ThreadFactory接口,

技术分享

在DefaultThreadFactory构造方法中确定线程的命名前缀,之后每创建一个线程,poolNumber不变,threadNumber++,并设置线程是否是Deamon线程、线程的优先级等。

技术分享 

何时调用newThread()方法呢?Worker是对提交任务的封装,如果调用Worker的构造方法,就会创建一个新的线程中去执行任务。

技术分享 

现在我们来看看线程池的运行原理:当提交任务到线程池中,会调用execute方法

技术分享

如果当前线程数比核心线程数小,那么就添加一个Worker(也就是创建一个新的线程,去处理这个任务),并直接return。如果已经达到核心线程数,那么新来的任务会插入到阻塞队列中,也就是workQueue.offer(command).如果队列也满了,还有任务到来的话,那么就继续创建新的线程。如果创建新的线程时池子已经达到最大线程数,就采取拒绝策略。

添加Worker的方法:

 技术分享技术分享

在该方法中会调用new Worker(firstTask)构造函数,创建线程并运行此任务。

 

线程池的实现原理

标签:分享   factory   dfa   队列   技术分享   阻塞队列   函数   线程池   actor   

原文地址:http://www.cnblogs.com/james111/p/7382619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!