2019年互联网(1.8)
一.JUC多线程及并发包
1.8.线程池用过吗?ThreadPoolExecutor谈谈你的理解?
为什么使用线程池?
线程池作的工作主要:
-
控制运行线程的数量
-
处理过程中将任务加入队列,在线程创建后,直接启动这些任务
-
如果创建超过了最大数量,超出的数量将进入队列排队登录,等其他线程执行完毕以后,再从队列中取出任务来执行
主要特点:
- 线程复用
- 控制最大并发数
- 管理线程
优势:
第一:减低资源消耗,通过重复利用自己创建的线程降低线程创建和销毁造成的CPU资源消耗
第二: 提高响应速度,当任务到达时,任务可以不需要等到线程更改状态,就可以直接启动
第三:提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗CPU资源,还会降低系统
的稳定性,
使用线程池,可以统一分配,调优,和监控
线程池如何使用
架构实现
Java中的线程池 主要通过Executor框架实现的,该框架用到了Executor,Executors,ExecutorService,ThreadPoolExecutor
这几个类
编码实现
Executors.newWorkStealingPool(int);
java8新增,使用目前机器上可以的处理器作为他的并行级别
重点三个线程池类:
Executors.newFixedThreadPool(int): 执行一个长期的任务,性能好很多
主要特点如下:
1.创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待.
2.newFixedThreadPool创建的线程池corePoolSize和MaxmumPoolSize是 相等的,它使用的的LinkedBlockingQueue
线程池核心大参数
corePoolSize: int
maximumPoolSize:int
workQueue: LinkBlockingQueue
Executors.newSingleThreadExecutor():一个任务一个线程执行的任务场景
主要特点如下:
1.创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行.
2.newSingleThreadExecutor将corePoolSize和MaxmumPoolSize都设置为1,它使用的的LinkedBlockingQueue
corePoolSize: 1
maximumPoolSize:0
workQueue: LinkBlockingQueue
Executors.newCachedThreadPool():适用:执行很多短期异步的小程序或者负载较轻的服务器
主要特点如下:
1.创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程.
2.newCachedThreadPool将corePoolSize设置为0MaxmumPoolSize设置为Integer.MAX_VALUE,它使用的是SynchronousQUeue,也就是说来了任务就创建线程运行,如果线程空闲超过60秒,就销毁线程
corePoolSize: 0
maximumPoolSize:MAX_Integer
workQueue: SynchronousQueue
线程池的7大参数
1.corePoolSize:线程池中的常驻核心线程数
2.maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1
3.keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止
4.unit:keepAliveTime的单位
5.workQueue:任务队列,被提交但尚未被执行的任务.
6.threadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可
7.handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝.
线程池的底层原理
所有线程底层所创建的线程池都是基于以下线程池来创建的!
底层源码:
四种常见的线程池:
CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。
SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。
SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。
FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程
线程执行流程如下:(口述)