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