Java 執行緒池之Jetty 執行緒池學習總結
前提
Jetty 11.0.x
為什么是Jetty?
Java提供4中創建執行緒池的快捷方式
Executors.newFixedThreadPool();
Executors.newCachedThreadPool();
Executors.newSingleThreadExecutor();
Executors.newScheduledThreadPool();
但通常我們很少用這4個工廠方法去創建執行緒池,而是直接使用ThreadPoolExecutor類構造執行緒池,因為這些工廠方法最終也是呼叫這個類來創建執行緒池的,
眾所周知,雖然ThreadPoolExecutor提供了corePoolSize和maximumPoolSize兩個引數來控制執行緒池的基本大小和最大大小,但是這兩個引數并不是那么好用:當任務佇列采用SynchronousQueue時,通常需要無界的maximumPoolSize;當任務佇列采用無界佇列時,maximumPoolSize的值又相當于不起作用;當任務佇列采用有界佇列時,僅在任務佇列已滿,且未達到maximumPoolSize時才會擴充執行緒池大小,
既然如此,那有沒有一種更簡單的實作方案呢?使用該方案,使用者只需要簡單的配置下執行緒池的基本大小和最大大小,程式就可以根據任務的繁忙程度自動調整當前執行緒數量,答案是有的:Jetty--一個基于Java的web容器,和Tomcat齊名
Jetty執行緒池介紹
任務處理流程

初始化執行緒池
程式初始化運行時,會先創建執行緒池,執行緒池大小默認為minThreads,也就是說會預先創建minThreads個執行緒,執行緒名稱格式形如“qtp1076496284-13”
創建執行緒池時:
-
如果未指定最大執行緒數(
maxThreads),則默認為 200; -
如果未指定最小執行緒數(
minThreads),則默認為 8 -
如果未指定執行緒空閑超時時間(
idleTimeout),則默認為 60000,即60秒 -
保留執行緒數(
reservedThreads)默認為 -1 -
如果未指定任務佇列,則默認創建
BlockingArrayQueue任務佇列,容量大小為 8 x 1024 -
如果指定的最大執行緒數小于最小執行緒數,則拋出例外
執行緒池擴縮容
- 當前執行緒數比最小執行緒數小,或者沒有空閑的執行緒,且當前執行緒數(
threads)小于最大執行緒數,則創建執行緒; idleTimout大于0且當前執行緒數大于最小執行緒數,且執行緒空閑時間超過idleTimeout,則停止執行緒
注意:程式判斷是否存在空閑執行緒的邏輯是這樣的:Net空閑執行緒數 = 空閑執行緒數 - 任務佇列大小,如果“Net空閑執行緒數”為負數,則表示不存在空閑執行緒,即需要更多的執行緒來處理任務,
任務佇列及執行緒相關定義
queueSize 任務佇列大小,即佇列中等待被執行緒執行的任務數,可通過getQueueSize()函式獲取,
threads 當前執行緒池中的執行緒數,包括已租給內部組件的執行緒、空閑執行緒、保留執行緒,以及正在執行臨時作業的執行緒,threads = readyThreads + leasedThreads + utilizedThreads, 可通過getThreads() 函式獲取,
readyThreads 準備執行臨時任務的執行緒數,readyThreads = idleThreads + availableReservedThreads,可通過getReadyThreads()函式獲取,
idleThreads 未被保留的空閑執行緒數,idleThreads = readyThreads - availableReservedThreads,可通過getIdleThreads()函式獲取,
reservedThreads 保留的執行緒數,默認值為-1,可通過getReservedThreads()函式獲取,
availableReservedThreads 可用的保留執行緒,可通過getAvailableReservedThreads()函式獲取,
leasedThreads 供內部組件使用,用于執行內部任務的執行緒,需要執行緒的Jetty組件(比如網路acceptors和selector)可能會使用ThreadPoolBudget從執行緒池中租用執行緒,站在執行緒池的角度來看,這些被租用的執行緒是活躍的,但是不能用于執行臨時任務,比如一個HTTP請求,或者一個WebSocket幀,QueuedThreadPool有一個ReservedThreadExecutor,該組件會從執行緒池租用執行緒,但會讓這些執行緒可用,就像它們是“idle”執行緒一樣,執行緒池啟動后,該值一般是恒定的,可通過getLeasedThreads()函式獲取,
minThreads 執行緒池中的最小執行緒數,可通過getMinThreads() 函式獲取,
maxThreads 執行緒池中的最大執行緒數,可通過getMaxThreads() 函式獲取,
maxAvailableThreads 可用于執行臨時任務的最大執行緒數,maxAvailableThreads = maxThreads - leasedThreads 可通過getMaxAvailableThreads()函式獲取,
utilizedThreads執行臨時任務的執行緒數,可通過getUtilizedThreads()函式獲取,utilizedThreads = threads - leasedThreads - readyThreads
utilizationRate = utilizedThreads / maxAvailableThreads 執行臨時任務的執行緒利用率,該值為0.0D則表示執行緒池未被利用,如果為1.0D則表示執行緒池被充分利用于執行臨時任務,可通過getUtilizationRate() 函式獲取,
busyThreads 正在執行內部任務和臨時任務的執行緒數, busyThreads = utilizedThreads + leasedThreads,可通過getBusyThreads()函式獲取,
參考鏈接
https://www.eclipse.org/jetty/javadoc/jetty-11/org/eclipse/jetty/util/thread/QueuedThreadPool.html
https://gitee.com/Tedgar156/jetty.project/blob/jetty-11.0.x/jetty-util/src/main/java/org/eclipse/jetty/util/thread/QueuedThreadPool.java
作者:授客
微信/QQ:1033553122
全國軟體測驗QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞后如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測驗交流QQ群
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/528718.html
標籤:Java
上一篇:設計模式---裝飾器模式
下一篇:log4j 1 升級方案
