查看: 153|回复: 0

简单看看ThreadPoolExecutor原理

[复制链接]
发表于 2020-2-16 08:58:13 | 显示全部楼层 |阅读模式
  线程池的作用就不多说了,其实就是办理两类问题:一是当实行大量的异步任务时线程池能够提供较好的性能,在不使用线程池时,每当必要实行异步任务是必要直接new一个线程去实行,而线程的创建和销毁是必要花销的,而线程池中的线程是可复用的,不必要每次实行异步任务时都去创建和销毁线程;二是线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数、动态新增线程等;

一.Executors工具类
  我们创建一个线程池最好直接用这个工具类去创建,常用的线程池有几种,一种是用newFixedThreadPool方法创建固定大小的线程池,一种是newSingleThreadExecutor方法创建单线程的线程池,一种是newCachedThreadPool方法创建线程最多个数为Integer.MAX_VALUE的线程池,另有一些其他的线程池;
  看一下Executors工具类中一些紧张的方法,先是newFixedThreadPool方法,只看这个,我们可以现实的线程池类型是ThreadPoolExecutor,而且内部是以LinkedBlockingQueue这个并发队列实现的,前面说过,这是一个有界阻塞队列,底层是一个单向链表,入队和出队是用独占锁实现的一个生产者斲丧者模式,比较容易;


  newSingleThreadExecutor方法,其实可以看到就是用上面的这种线程池实现的,只不过限制了线程池中线程必须只能是一个;


  newCachedThreadPool方法,这种线程池也是以最上面的那种形式实现的,只不过限制了最大的数量是Integer.MAX_VALUE


  由上面可知,三种其实都是以ThreadPoolExecutor实现的,以是我们了解这个类的实现机制就行了;

二.简单看看ThreadPoolExecutor结构
  先看看其中的属性,比较多:
[code]public class ThreadPoolExecutor extends AbstractExecutorService {    //这个原子变量用于记录线程池的状态和其中线程的数量,    //就雷同读写锁内里一个int变量,高16位表示读锁的获取次数,低16位表示某一个线程获取写锁的可重入次数    //在线程池这里,高3位表示线程池状态,后面的29位表示线程池线程数量,默认线程池状态是RUNNING,线程数量为0    private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));    //这里叫做线程个数掩码位数,举个例子,线程状态为STOP时,即1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?用户注册

x

相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表