文章目錄
- 高并發-線程池2024
- 心得
- 好的博客
- 必會面試題
- 為什么使用線程池
- 線程池的實現原理
- 線程池的拒絕策略
- 阻塞隊列已滿,在提交任務會發生什么問題
- threadlocal原理和使用
- 多線程配置
高并發-線程池2024
心得
-
面試都是圍繞著三高展開,高并發,高可用,分布式展開。
多線程屬于高并發的范疇
-
好多問題在數據訪問量比較小的情況下不好發生,但是數據量比較大的情況下,就要考慮更多,否則就會出問題。
-
在學習原理和底層這塊,會用到很多的圖例,圖解,
這塊最好用在線畫圖工具自己畫出來,并把鏈接貼過來,或者用md來畫圖也可以。
好的博客
- JUC學習指南 這里主要介紹的背景,屬于前言
- JUC快速入門各個知識點匯總
知識比較全面
九、線程池(重點)講的比較好
下面是四種不同拒絕策略的使用效果
十二、死鎖問題及排查
- synchronized原理分析
- JMeter詳細使用教程及實際案例
必會面試題
- 多線程
- 面試題 26 . 簡述 Synchronized 的原理 ?
- 面試題 42 . Java 中的線程池是如何實現 ?
- 面試題 43 . Java創建線程池的幾個核心構造參數?
- 面試題 44 . 請簡述Java線程池中的線程是怎么創建的?
- 面試題 86 . 請列舉ThreadPoolexecutor參數配置?
- 面試題 103 . 簡述Java線程池中隊列常用類型有哪些 ?
- 面試題 122 . 簡述樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?
為什么使用線程池
使用線程池的優點
減少不斷創建和銷毀線程的資源銷耗,可以重復利用線程池中的線程
提高任務響應速度,不需要等待線程創建,就可以直接使用存在的線程
便于管理,可以統一的分配,管理和調優。
線程池的實現原理
如果線程數少于核心線程線程數,既是有線程空閑也是會創建新的線程。
如果線程數等于核心線程,那么就會把任務放到隊列中。
如果線程池線程數大于或等于核心線程數,并且隊列以及滿了,但是線程數小于最大線程,那么就會創建新的線程來處理。
如果線程數達到了最大線程數,那么就會通過handle設置的策略來拒絕這個任務。
并且線程中的線程如果空閑時間超過了指定的空閑時間,就會被銷毀,從而動態的調整線程池的數量。
線程池的拒絕策略
可以在構造器中設置線程池的拒絕策略
核心線程 最大線程 隊列 首先核心線程創建,其次隊列打滿,才會繼續創建線程,線程達到最大線程后,就會執行拒絕策略。有4種拒絕的策略
第一個 線程池滿了一行,會拋出一個runtime的異常,我們可以感知到線程池已滿,可以重試或放棄提交。
第二種,線程池滿了,直接丟棄,不會通知,會有一定的風險
第三種,線程池滿了,會丟棄線程隊列中時間最長的線程,也會存在風險。
第四種,線程滿了,先進行等待,等有資源了在提交新的任務。
我們也可以在方法中大于自己的日志,當線程池滿了的情況下,及時處理。
阻塞隊列已滿,在提交任務會發生什么問題
核心線程 阻塞隊列 非核心線程 執行拒絕策略
threadlocal原理和使用
這是一個線程本地存儲機制,這個是一個鍵值對
比方存儲保存用戶的信息,保存連接的對象。
在線程池使用的時候,如果線程一直占用,可能會出現內存泄漏的情況發生。解決的辦法是數據使用后要記得清除掉。
多線程配置
核心線程10個,其他線程根據電腦的核數,一核大概配置20個線程,隊列排1000個。