最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)

 更新時間:2023年02月18日 16:31:48   投稿:wdc  
這篇文章主要介紹了java 線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)包括了:配置線程池大小配置,線程池的實現(xiàn)原理等,需要的朋友可以參考下

為什么需要線程池

我們有兩種常見的創(chuàng)建線程的方法,一種是繼承Thread類,一種是實現(xiàn)Runnable的接口,Thread類其實也是實現(xiàn)了Runnable接口。但是我們創(chuàng)建這兩種線程在運行結(jié)束后都會被虛擬機銷毀,如果線程數(shù)量多的話,頻繁的創(chuàng)建和銷毀線程會大大浪費時間和效率,更重要的是浪費內(nèi)存。那么有沒有一種方法能讓線程運行完后不立即銷毀,而是讓線程重復(fù)使用,繼續(xù)執(zhí)行其他的任務(wù)哪?

這就是線程池的由來,很好的解決線程的重復(fù)利用,避免重復(fù)開銷。

線程池的優(yōu)點

1、線程是稀缺資源,使用線程池可以減少創(chuàng)建和銷毀線程的次數(shù),每個工作線程都可以重復(fù)使用。

2、可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線程的數(shù)量,防止因為消耗過多內(nèi)存導(dǎo)致服務(wù)器崩潰。

線程池的風(fēng)險

雖然線程池是構(gòu)建多線程應(yīng)用程序的強大機制,但使用它并不是沒有風(fēng)險的。用線程池構(gòu)建的應(yīng)用程序容易遭受任何其它多線程應(yīng)用程序容易遭受的所有并發(fā)風(fēng)險,諸如同步錯誤和死鎖,它還容易遭受特定于線程池的少數(shù)其它風(fēng)險,諸如與池有關(guān)的死鎖、資源不足和線程泄漏。

1.死鎖

任何多線程應(yīng)用程序都有死鎖風(fēng)險。當(dāng)一組進程或線程中的每一個都在等待一個只有該組中另一個進程才能引起的事件時,我們就說這組進程或線程 死鎖了。死鎖的最簡單情形是:線程 A 持有對象 X 的獨占鎖,并且在等待對象 Y 的鎖,而線程 B 持有對象 Y 的獨占鎖,卻在等待對象 X 的鎖。除非有某種方法來打破對鎖的等待(Java 鎖定不支持這種方法),否則死鎖的線程將永遠等下去。

2.資源不足

線程池的一個優(yōu)點在于:相對于其它替代調(diào)度機制(有些我們已經(jīng)討論過)而言,它們通常執(zhí)行得很好。但只有恰當(dāng)?shù)卣{(diào)整了線程池大小時才是這樣的。

線程消耗包括內(nèi)存和其它系統(tǒng)資源在內(nèi)的大量資源。除了
Thread 對象所需的內(nèi)存之外,每個線程都需要兩個可能很大的執(zhí)行調(diào)用堆棧。除此以外,JVM 可能會為每個 Java
線程創(chuàng)建一個本機線程,這些本機線程將消耗額外的系統(tǒng)資源。最后,雖然線程之間切換的調(diào)度開銷很小,但如果有很多線程,環(huán)境切換也可能嚴重地影響程序的性能。

如果線程池太大,那么被那些線程消耗的資源可能嚴重地影響系統(tǒng)性能。在線程之間進行切換將會浪費時間,而且使用超出比您實際需要的線程可能會引起資源匱乏問題,因為池線程正在消耗一些資源,而這些資源可能會被其它任務(wù)更有效地利用。

除了線程自身所使用的資源以外,服務(wù)請求時所做的工作可能需要其它資源,例如 JDBC 連接、套接字或文件,這些也都是有限資源,有太多的并發(fā)請求也可能引起失效,例如不能分配 JDBC 連接。

3.并發(fā)錯誤

線程池和其它排隊機制依靠使用
wait() 和 notify()
方法,這兩個方法都難于使用。如果編碼不正確,那么可能丟失通知,導(dǎo)致線程保持空閑狀態(tài),盡管隊列中有工作要處理。使用這些方法時,必須格外小心;即便是專家也可能在它們上面出錯。而最好使用現(xiàn)有的、已經(jīng)知道能工作的實現(xiàn),例如在
util.concurrent 包。

4.線程泄漏

各種類型的線程池中一個嚴重的風(fēng)險是線程泄漏,當(dāng)從池中除去一個線程以執(zhí)行一項任務(wù),而在任務(wù)完成后該線程卻沒有返回池時,會發(fā)生這種情況。發(fā)生線程泄漏的一種情形出現(xiàn)在任務(wù)拋出一個 RuntimeException 或一個 Error 時。

如果池類沒有捕捉到它們,那么線程只會退出而線程池的大小將會永久減少一個。當(dāng)這種情況發(fā)生的次數(shù)足夠多時,線程池最終就為空,而且系統(tǒng)將停止,因為沒有可用的線程來處理任務(wù)。

5.請求過載

僅僅是請求就壓垮了服務(wù)器,這種情況是可能的。在這種情形下,我們可能不想將每個到來的請求都排隊到我們的工作隊列,因為排在隊列中等待執(zhí)行的任務(wù)可能會消耗太多的系統(tǒng)資源并引起資源缺乏。在這種情形下決定如何做取決于您自己;在某些情況下,您可以簡單地拋棄請求,依靠更高級別的協(xié)議稍后重試請求,您也可以用一個指出服務(wù)器暫時很忙的響應(yīng)來拒絕請求。

線程池的實現(xiàn)原理

線程池

線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)-mikechen的互聯(lián)網(wǎng)架構(gòu)

1.線程池狀態(tài)

線程池和線程一樣擁有自己的狀態(tài),在ThreadPoolExecutor類中定義了一個volatile變量runState來表示線程池的狀態(tài),線程池有四種狀態(tài),分別為RUNNING、SHURDOWN、STOP、TERMINATED。

  •  線程池創(chuàng)建后處于RUNNING狀態(tài)。
  •  調(diào)用shutdown后處于SHUTDOWN狀態(tài),線程池不能接受新的任務(wù),會等待緩沖隊列的任務(wù)完成。
  •  調(diào)用shutdownNow后處于STOP狀態(tài),線程池不能接受新的任務(wù),并嘗試終止正在執(zhí)行的任務(wù)。
  •  當(dāng)線程池處于SHUTDOWN或STOP狀態(tài),并且所有工作線程已經(jīng)銷毀,任務(wù)緩存隊列已經(jīng)清空或執(zhí)行結(jié)束后,線程池被設(shè)置為TERMINATED狀態(tài)。

線程池原理:預(yù)先啟動一些線程,線程無限循環(huán)從任務(wù)隊列中獲取一個任務(wù)進行執(zhí)行,直到線程池被關(guān)閉。如果某個線程因為執(zhí)行某個任務(wù)發(fā)生異常而終止,那么重新創(chuàng)建一個新的線程而已,如此反復(fù)。

2.線程池的處理流程

1、判斷線程池里的核心線程是否都在執(zhí)行任務(wù),如果不是(核心線程空閑或者還有核心線程沒有被創(chuàng)建)則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果核心線程都在執(zhí)行任務(wù),則進入下個流程。

2、線程池判斷工作隊列是否已滿,如果工作隊列沒有滿,則將新提交的任務(wù)存儲在這個工作隊列里。如果工作隊列滿了,則進入下個流程。

3、判斷線程池里的線程是否都處于工作狀態(tài),如果沒有,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù)。如果已經(jīng)滿了,則交給飽和策略來處理這個任務(wù)。

線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)-mikechen的互聯(lián)網(wǎng)架構(gòu)

配置線程池大小配置

一般需要根據(jù)任務(wù)的類型來配置線程池大?。?/p>

如果是CPU密集型任務(wù),就需要盡量壓榨CPU,參考值可以設(shè)為 NCPU+1

如果是IO密集型任務(wù),參考值可以設(shè)置為2*NCPU

當(dāng)然,這只是一個參考值,具體的設(shè)置還需要根據(jù)實際情況進行調(diào)整,比如可以先將線程池大小設(shè)置為參考值,再觀察任務(wù)運行情況和系統(tǒng)負載、資源利用率來進行適當(dāng)調(diào)整。

Java提供的四種線程池實現(xiàn)

(1)newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。

(2)newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。

(3)newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。

(4)newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

以上就是java 線程池的實現(xiàn)原理、優(yōu)點與風(fēng)險、以及4種線程池實現(xiàn)的詳細內(nèi)容,更多關(guān)于java 線程池的實現(xiàn)原理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java HashSet集合存儲遍歷學(xué)生對象代碼實例

    Java HashSet集合存儲遍歷學(xué)生對象代碼實例

    這篇文章主要介紹了Java HashSet集合存儲遍歷學(xué)生對象代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringMVC基于注解方式實現(xiàn)上傳下載

    SpringMVC基于注解方式實現(xiàn)上傳下載

    本文主要介紹了SpringMVC基于注解方式實現(xiàn)上傳下載,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java中常見的陷阱題及答案

    Java中常見的陷阱題及答案

    在電腦里找到一份當(dāng)時學(xué)習(xí)JAVA時的筆記,看到一些現(xiàn)在已經(jīng)遺忘的細節(jié)。稍微整理了幾個,發(fā)出來與大家分享。這篇文章主要介紹了Java中常見的陷阱題及答案,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • Java實現(xiàn)正則匹配 “1234567” 這個字符串出現(xiàn)四次或四次以上

    Java實現(xiàn)正則匹配 “1234567” 這個字符串出現(xiàn)四次或四次以上

    文章介紹了如何在Java中使用正則表達式匹配一個字符串四次或四次以上的出現(xiàn),首先創(chuàng)建正則表達式,然后使用Pattern和Matcher類進行匹配和計數(shù),通過示例代碼展示了如何實現(xiàn)這一功能,并解釋了匹配的整體次數(shù)和精確出現(xiàn)次數(shù)的邏輯,感興趣的朋友一起看看吧
    2025-02-02
  • Java基于IDEA實現(xiàn)qq郵件發(fā)送小程序

    Java基于IDEA實現(xiàn)qq郵件發(fā)送小程序

    這篇文章主要介紹了Java基于IDEA實現(xiàn)qq郵件發(fā)送小程序功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • java Scanner輸入數(shù)字、字符串過程解析

    java Scanner輸入數(shù)字、字符串過程解析

    這篇文章主要介紹了java Scanner輸入數(shù)字、字符串過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java中String性能優(yōu)化

    Java中String性能優(yōu)化

    本文給大家分享的是如何在java中對String進行性能優(yōu)化,使用String的時候需要有哪些注意事項呢,這就是今天我們要給大家總結(jié)分析的,有需要的小伙伴可以參考下。
    2015-03-03
  • SpringBoot redis分布式緩存實現(xiàn)過程解析

    SpringBoot redis分布式緩存實現(xiàn)過程解析

    這篇文章主要介紹了SpringBoot redis分布式緩存實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Springboot3整合Mybatis3的完整步驟記錄

    Springboot3整合Mybatis3的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于Springboot3整合Mybatis3的完整步驟,Spring Boot和MyBatis分別是兩個功能強大的框架,它們的協(xié)同使用可以極大地簡化數(shù)據(jù)訪問層的開發(fā),提高整體的開發(fā)效率,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • 基于SpringBoot的Dubbo泛化調(diào)用的實現(xiàn)代碼

    基于SpringBoot的Dubbo泛化調(diào)用的實現(xiàn)代碼

    這篇文章主要介紹了基于SpringBoot的Dubbo泛化調(diào)用的實現(xiàn),從泛化調(diào)用實現(xiàn)的過程來看,我們可以對自己提供所有服務(wù)進行測試,不需要引入調(diào)用的接口,減少代碼的侵入,需要的朋友可以參考下
    2022-04-04

最新評論

蒙自县| 灯塔市| 卢龙县| 晋宁县| 名山县| 梁山县| 化州市| 沾化县| 海淀区| 体育| 亚东县| 自贡市| 乐清市| 呼图壁县| 乐清市| 望奎县| 平昌县| 象州县| 伊宁市| 禹城市| 湘乡市| 浦城县| 垦利县| 胶南市| 德庆县| 秦皇岛市| 内乡县| 瑞昌市| 尉氏县| 肇东市| 太仆寺旗| 芜湖县| 钟山县| 从化市| 仁化县| 靖边县| 水城县| 山西省| 平阴县| 岳阳市| 望都县|