JDK线程池原理剖析

开篇:性能优化

这篇文章直接讲解原理架构

一、线程池关键参数解释并发

JDK 线程池的实现类是 ThreadPoolExecutor,构造函数关键参数解释以下:分布式

corePoolSize 核心线程,线程池维持的线程数量,即便没有任务执行也会维持这个数量不变,除非设置了 allowCoreThreadTimeOut 这个参数为 true函数

maximumPoolSize 线程池中容许建立线程的最大数量微服务

keepAliveTime 非核心线程的空闲等待时间,超过这个时间将被销毁高并发

unit 针对keepAliveTime 参数的时间单位源码分析

workQueue 任务队列性能

 

二、 execute和submit的区别?优化

1)submit有返回值

2)submit提交的线程类型,会被jdk包装成一个FutureTask

 

三、运行原理

3.1任务执行流程

这不是一个流程图,是为了说明线程启动到执行任务的大概流程

在此我向你们推荐一个Java架构群 :725633148 里面会分享一些资深架构师录制的视频录像:(有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构)等这些成为架构师必备的知识体系 进群立刻免费领取,目前受益良多!

3.2 源码分析

先说下执行主流程,再细看源码。

执行流程:execute(Runnable command) >>addWorker(Runnable firstTask, boolean core)>>runWorker(Worker w)

源码分析:

1)execute(Runnable command)方法

  该方法会调用addWorker(Runnable firstTask, boolean core)方法执行任务

2)addWorker(Runnable firstTask, boolean core) 方法

该方法代码比较长,咱们看下关键的代码部分

既然启动线程了,那咱们就去Worker里看看

3) Worker 内部类

既然2)中调用了start()方法,那么必然会调用Worker的 run()方法

接下来看 runWorker(this)方法,最最关键的部分就在这里,老办法,咱们也仍是看最关键的代码片断

4)看下这个方法 processWorkerExit(Worker w, boolean completedAbruptly)

            总结一下,线程池就是维护一个线程集合,用这些线程来反复的执行任务,这些线程分为核心线程和非核心线程,核心线程通常不会被销毁,就算是没有任务也会空闲等待(除了设置 allowCoreThreadTimeOut参数),非核心线程,当空闲等待时间到达设置的参数范围,就会被销毁回收。比较难理解的是JDK是如何维护线程集合并执行任务?这里在说一下,线程池初始化,当第一个任务来的时候,线程池会建立一个线程并将该线程存入一个线程集合,刚才的任务做为该线程的第一个任务执行,执行完该任务,此时线程不会当即结束,会经过getTask()方法,以阻塞等待方式从任务队列里面获取任务执行,所以若是阻塞队列有任务,就取出任务执行,若是队列没有任务,就阻塞等待任务,因此正常状况下,该线程会一直存活。当第二个任务来了之后,会执行和第一个任务一样的动做,以此类推,直到核心线程数量达到corePoolSize设置的参数数量,这样就造成了线程集合,也就是线程池。当任务不少的时候,核心线程不能及时所有处理完毕,此时线程池就会将任务存入任务队列,若是队列满了,而且 maximumPoolSize 大于 corePoolSize,就会建立非核心线程执行任务。

相关文章
相关标签/搜索