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,就會建立非核心線程執行任務。

相關文章
相關標籤/搜索