摘要:線程池的工作原理一個線程池管理了一組工作線程,同時它還包括了一個用于放置等待執(zhí)行任務(wù)的任務(wù)隊列阻塞隊列。使用線程池可以對線程進行統(tǒng)一的分配和監(jiān)控。線程池的注意事項雖然線程池是構(gòu)建多線程應(yīng)用程序的強大機制,但使用它并不是沒有風(fēng)險的。
線程池的工作原理
一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行
任務(wù)的任務(wù)隊列(阻塞隊列) 。
一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執(zhí)行
任務(wù)的任務(wù)隊列(阻塞隊列) 。
默認情況下, 在創(chuàng)建了線程池后, 線程池中的線程數(shù)為 0。 當(dāng)任務(wù)提交給
線程池之后的處理策略如下:
1 如果此時線程池中的數(shù)量小于 corePoolSize(核心池的大小) , 即使線程池中的線程都處于空閑狀態(tài), 也要創(chuàng)建新的線程來處理被添加的任務(wù)(也就是每來一個任務(wù), 就要創(chuàng)建一個線程來執(zhí)行任務(wù)) 。
2 如果此時線程池中的數(shù)量大于等于 corePoolSize, 但是緩沖隊列workQueue 未滿, 那么任務(wù)被放入緩沖隊列, 則該任務(wù)會等待空閑線程將其取出去執(zhí)行。
3 如果此時線程池中的數(shù)量大于等于 corePoolSize , 緩 沖 隊 列workQueue 滿, 并且線程池中的數(shù)量小于 maximumPoolSize(線程池最大線程數(shù)) , 建新的線程來處理被添加的任務(wù)。
4 如果 此時 線程 池中 的數(shù)量 大 于 等 于 corePoolSize, 緩 沖 隊列workQueue 滿, 并且線程池中的數(shù)量等于 maximumPoolSize, 那么通過RejectedExecutionHandler 所指定的策略(任務(wù)拒絕策略)來處理此任務(wù)。也就是處理任務(wù)的優(yōu)先級為: 核心線程 corePoolSize、 任務(wù)隊列workQueue、 最大線程 maximumPoolSize, 如果三者都滿了, 使用handler 處理被拒絕的任務(wù)。
特別注意, 在 corePoolSize 和 maximumPoolSize 之間的線程數(shù)會被自動釋放。 當(dāng)線程池中線程數(shù)量大于 corePoolSize 時, 如果某線程空閑時間超過 keepAliveTime, 線程將被終止, 直至線程池中的線程數(shù)目不大于 corePoolSize。 這樣, 線程池可以動態(tài)的調(diào)整池中的線程數(shù)。
使用線程池的好處
1.通過重復(fù)利用已創(chuàng)建的線程, 減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷。
2.提高響應(yīng)速度。 當(dāng)任務(wù)到達時, 任務(wù)可以不需要等到線程創(chuàng)建就可以立即行。
3.提高線程的可管理性。 使用線程池可以對線程進行統(tǒng)一的分配和監(jiān)控。
4.如果不使用線程池, 有可能造成系統(tǒng)創(chuàng)建大量線程而導(dǎo)致消耗完系統(tǒng)內(nèi)存。
線程池的注意事項
雖然線程池是構(gòu)建多線程應(yīng)用程序的強大機制, 但使用它并不是沒有風(fēng)險的。
(1) 線程池的大小。 多線程應(yīng)用并非線程越多越好, 需要根據(jù)系統(tǒng)運行的軟硬件環(huán)境以及應(yīng)用本身的特點決定線程池的大小。 一般來說, 如果代碼結(jié)構(gòu)合理的話, 線程數(shù)目與 CPU數(shù)量相適合即可。 如果線程運行時可能出現(xiàn)阻塞現(xiàn)象, 可相應(yīng)增加池的大??; 如有必要可采用自適應(yīng)算法來動態(tài)調(diào)整線程池的大小, 以提高 CPU 的有效利用率和系統(tǒng)的整體性能。
(2) 并發(fā)錯誤。 多線程應(yīng)用要特別注意并發(fā)錯誤, 要從邏輯上保證程序的正確性, 注意避免死鎖現(xiàn)象的發(fā)生。
(3) 線程泄漏。 這是線程池應(yīng)用中一個嚴重的問題, 當(dāng)任務(wù)執(zhí)行完畢而線程沒能返回池中就會發(fā)生線程泄漏現(xiàn)象。
學(xué)習(xí)交流群:669823128
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70434.html
摘要:當(dāng)活動線程核心線程非核心線程達到這個數(shù)值后,后續(xù)任務(wù)將會根據(jù)來進行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時默默丟棄不能執(zhí)行的新加任務(wù),不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:每個通過網(wǎng)絡(luò)到達服務(wù)器的連接都被包裝成一個任務(wù)并且傳遞給線程池。線程池的線程會并發(fā)的處理連接上的請求。用線程池控制線程數(shù)量,其他線程排隊等候。實現(xiàn)包,線程池頂級接口是但是嚴格意義講并不是一個線程。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求。 tutorial site1tutorial site2 一個問題: 每啟動一個新線程都會有相應(yīng)的性能開銷(涉及到OS的交互:創(chuàng)建線程,銷毀線程...
摘要:本文只介紹中線程池的基本使用,不會過多的涉及到線程池的原理??删彺婢€程的線程池創(chuàng)建一個可緩存線程的線程池。首先是從接口繼承到的方法使用該方法即將一個任務(wù)交給線程池去執(zhí)行。方法方法的作用是向線程池發(fā)送關(guān)閉的指令。 首先,我們?yōu)槭裁葱枰€程池?讓我們先來了解下什么是 對象池 技術(shù)。某些對象(比如線程,數(shù)據(jù)庫連接等),它們創(chuàng)建的代價是非常大的 —— 相比于一般對象,它們創(chuàng)建消耗的時間和內(nèi)存都...
閱讀 3752·2021-11-24 10:46
閱讀 1718·2021-11-15 11:38
閱讀 3772·2021-11-15 11:37
閱讀 3496·2021-10-27 14:19
閱讀 1955·2021-09-03 10:36
閱讀 2003·2021-08-16 11:02
閱讀 3009·2019-08-30 15:55
閱讀 2262·2019-08-30 15:44