并发编程之ThreadPoolExecutor源码分析
前言
很久没写博客了,今天分享下阅读ThreadPoolExecutor线程池的核心流程的一些源码分析
关于提交优先级和执行优先级
线程池提交任务流程:核心线程创建,阻塞队列存放,最大线程数创建。 我们知道阿里的规约中明确不让使用,
newFixedThreadPool,newSingleThreadExecutor,newCachedThreadPool
我简单贴个图 为什么不行,注意2处,最大线程数为Integer.MAX_VALUE,可以简单理解为无限。 队列是SynchronousQueue,这是个同步队列,典型的生产者和消费者模型。当队列有任务,必须take后才能继续加入队列。 此时任务若执行时间很长,队列满的,则会创建非核心线程,但是最大线程数无限,高并发情况会拖垮机器CPU。 这个就是属于只有1个核心线程数,最大线程也是1。相当于一个工厂只有1个员工兼职老板。当然不推荐 注意这个是核心线程数和最大线程数相同,相当于没有外包干活。
提交优先级就是一个任务来了之后,是如何提交。
此处的work就是干活的人,其内部有个线程属性
当执行完start方法。就会执行work中的run方法
work的run方法 此时开始执行任务 什么是执行优先级? 当核心线程和非核心线程有任务时,便会去执行,而队列中的任务,则会等执行完毕后才去执行,这就是执行优先级: 会先把核心线程和非核心线程的任务执行完毕,再去队列中拿任务执行。
关于线程池的执行和Thread.start的区别
直接调用传过来的任务的方法。
addWorker(null, false);
相当于创建个线程,然后去队列获取任务执行。也就是线程复用
|