java线程池源码的简单分析
工作中用过线程池来进行多线程的操作,但是也仅仅是停留在使用方面,没有深入研究,现在通过源码来仔细研究下java的线程池。关于线程池的优缺点就不研究了,直接通过一个源码来看看java中线程池的原理。
使用ThreadPoolExecutor来创建一个线程池
public class MultipleThread { public static void main(String[] args) { /** * 通过ThreadPoolExecutor来创建一个线程池 * * 我们创建的线程池 核心线程数为10,最大线程数为10,也就是线程池的大小就是为10个线程 * * 非核心线程的在没有任务执行的时候存活的时间设置为0,时间单位是毫秒(设置为0意味着不过期,不会超时被回收) * * LinkedBlockingQueue作为工作队列,用于存储工作任务 */ ExecutorService executorService = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); Future<?> a = executorService.submit(() -> System.out.println("当前线程:" + Thread.currentThread().getName()) ); Future<?> aa = executorService.submit(() -> System.out.println("当前线程:" + Thread.currentThread().getName())); Future<?> aaa = executorService.submit(() -> System.out.println("当前线程:" + Thread.currentThread().getName())); Future<?> aaaa = executorService.submit(() -> System.out.println("当前线程:" + Thread.currentThread().getName())); Future<?> aaaaa = executorService.submit(() -> System.out.println("当前线程:" + Thread.currentThread().getName())); } }
我们通过ThreadPoolExecutor的构造函数来看看线程池是怎么创建的
ThreadPoolExecutor构造方法:
提交一个任务
提交任务后,其实是调用execute方法去向工作队列添加任务的,我们接着看这个execute方法的实现。
总结就是:
1、当前活动线程数小于核心线程数,则创建一个核心线程,并执行提交的任务
2、当前活动线程数大于等于核心线程数,并且队列可以添加任务,则将任务添加到队列中去
3、当前活动线程数大于等于核心线程数,并且队列不能添加任务(队列满了),则创建一个非核心线程来处理提交的任务
接下来我们看addWorker这个方法
接下来我们看runWorker方法
我们再看下getTask()方法,这个方法就是线程复用的关键方法。
好了,初步的源码分析就到这儿。
相关推荐
ljngya 2020-07-30
齐天大圣数据候 2020-07-30
爱传文档 2020-07-28
jameszgw 2020-06-25
fengling 2020-05-31
meylovezn 2020-05-30
大步流星 2020-05-28
Ken专注后端技术 2020-05-07
nurvnurv 2020-05-01
cenylon 2020-04-29
fengyeezju 2020-04-26
csde 2020-03-05
nbfcome 2020-02-21
huaye00 2020-02-18
xdhywj 2020-02-13
greensomnuss 2012-09-11
xzkjgw 2020-01-23
少年阿涛 2020-01-12
MichelinMessi 2020-01-07