溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java線程池相關知識點有哪些

發(fā)布時間:2022-01-15 16:17:09 來源:億速云 閱讀:147 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“java線程池相關知識點有哪些”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java線程池相關知識點有哪些”吧!

線程池的意義:

    線程是稀缺資源,它的創(chuàng)建與銷毀是比較重且耗資原的操作。而java線程依賴于內(nèi)核線程,創(chuàng)建線程需要進行操作系統(tǒng)狀態(tài)切換,為了避免資源過度消耗需要設法重用線程執(zhí)行多個任務。線程池就是一個線程緩存,負責對線程進行統(tǒng)一分配,調(diào)優(yōu)與監(jiān)控。

線程池的優(yōu)勢:

重用存在的線程,減少線程的創(chuàng)建,消亡的開銷,提高性能

提高響應速度,當任務到達時,任務可以不需要等到線程創(chuàng)建就能立即執(zhí)行

提高線程的可管理性,線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控。

線程池的創(chuàng)建方式一共有五種

java線程池相關知識點有哪些

java線程池相關知識點有哪些

FixedThreadPool和SingleThreadExecutor => 允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而引起OOM異常

CachedThreadPool => 允許創(chuàng)建的線程數(shù)為Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而引起OOM異常(內(nèi)存溢出異常)

java線程池相關知識點有哪些

corePoolSize:核心線程數(shù) maximumPoolSize:最大線程數(shù) keepAliveTime:存活時間 unit:存活時間的單位 workQueue:類似于銀行辦理業(yè)務很忙的時候除了核心窗口
還要加一些臨時窗口 3.4的接口都是對于臨時窗口而言 handler:拒絕策略 所有的工作都滿了的時候 這時候會產(chǎn)生拒絕策略 jdk自帶了四種拒絕策略,也可以寫自己的拒絕策略
1:拋棄隊列 然后拋出異常 2:拋棄隊列 不拋出異常 3:拋棄隊列中的前幾個任務 重復執(zhí)行任務 4:調(diào)用者回退機制 讓調(diào)用者自己搞

java線程池相關知識點有哪些

線城池執(zhí)行流程:一開始只有兩個核心線程在工作,這時候再來線程就放到工作隊列中排隊,如果工作隊列也滿了,就創(chuàng)建臨時線程,如果臨時線程也滿足

不了的話,就執(zhí)行拒絕策略。

線程池的五種狀態(tài):

Running:能接受新任務,以及處理已經(jīng)添加的任務

Shutdown:不接受新任務,可以處理已經(jīng)添加的任務

Stop:不接受新任務,不處理已經(jīng)添加的任務,并且中斷正在處理的任務

Tidying:所有的任務已經(jīng)終止,ctl的任務數(shù)量為0(ctl負責記錄線程池的運行狀態(tài)與活動線程數(shù))

Terminated:線程池徹底終止,則線程池轉(zhuǎn)化為terminated狀態(tài)

線程池都有哪幾種工作隊列

  1. ArrayBlockingQueue:底層是數(shù)組,有界隊列,如果我們要使用生產(chǎn)者-消費者模式,這是非常好的選擇。

  2. LinkedBlockingQueue:底層是鏈表,可以當做無界和有界隊列來使用,所以大家不要以為它就是無界隊列。

  3. SynchronousQueue:本身不帶有空間來存儲任何元素,使用上可以選擇公平模式和非公平模式。

  4. PriorityBlockingQueue:無界隊列,基于數(shù)組,數(shù)據(jù)結(jié)構為二叉堆,數(shù)組第一個也是樹的根節(jié)點總是最小值。

舉例 ArrayBlockingQueue 實現(xiàn)并發(fā)同步的原理:原理就是讀操作和寫操作都需要獲取到 AQS 獨占鎖才能進行操作。如果隊列為空,這個時候讀操作的線程進入到讀線程隊列排隊,等待寫線程寫入新的元素,然后喚醒讀線程隊列的第一個等待線程。如果隊列已滿,這個時候?qū)懖僮鞯木€程進入到寫線程隊列排隊,等待讀線程將隊列元素移除騰出空間,然后喚醒寫線程隊列的第一個等待線程。

線程池的線程數(shù)量怎么確定

  1. 一般來說,如果是CPU密集型應用,則線程池大小設置為N+1。

  2. 一般來說,如果是IO密集型應用,則線程池大小設置為2N+1。

  3. 在IO優(yōu)化中,線程等待時間所占比例越高,需要越多線程,線程CPU時間所占比例越高,需要越少線程。這樣的估算公式可能更適合:最佳線程數(shù)目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數(shù)目

如何實現(xiàn)一個帶優(yōu)先級的線程池

利用priority參數(shù),繼承 ThreadPoolExecutor 使用 PriorityBlockingQueue 優(yōu)先級隊列。

感謝各位的閱讀,以上就是“java線程池相關知識點有哪些”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對java線程池相關知識點有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI