线程池出现的原因:
线程的频繁创建在高并发及大数据量是非常消耗资源的,因此Java提供了线程池,减少了创建和销毁线程所需的时间,从而提高效率。
-
线程池的分类
- newCachedThreadPool
- newFixedThreadPool
-
newScheduledThreadPool
-
newSingleThreadExecutor
不建议使用java提供的4类线程池,因为效率最高的newCachedThreadPool线程池中,队列使用的是无界的,可能会出现内存溢出现象
-
线程池原理剖析
corePoolSize: 核心池的大小。 当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中
maximumPoolSize: 线程池最大线程数,它表示在线程池中最多能创建多少个线程;
keepAliveTime: 表示线程没有任务执行时最多保持多久时间会终止。
unit: 参数keepAliveTime的时间单位,有7种取值
1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。
分析源码发现底层在线程调用时,执行的是run方法,所以线程池的线程执行比线程启动的start方法效率更高:
线程池中的线程复用原理:
在ThreadPoolExecutor类中的runWorker方法中,finnally代码块中:
如果出现不足的地方,欢迎大家指正,共同学习。