亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

為什么需要線程池

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

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

線程池的優(yōu)點

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

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

線程池的風險

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

1.死鎖

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

2.資源不足

線程池的一個優(yōu)點在于:相對于其它替代調(diào)度機制(有些我們已經(jīng)討論過)而言,它們通常執(zhí)行得很好。但只有恰當?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)性能。在線程之間進行切換將會浪費時間,而且使用超出比您實際需要的線程可能會引起資源匱乏問題,因為池線程正在消耗一些資源,而這些資源可能會被其它任務更有效地利用。

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

3.并發(fā)錯誤

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

4.線程泄漏

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

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

5.請求過載

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

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

線程池

線程池的實現(xiàn)原理、優(yōu)點與風險、以及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),線程池不能接受新的任務,會等待緩沖隊列的任務完成。
  •  調(diào)用shutdownNow后處于STOP狀態(tài),線程池不能接受新的任務,并嘗試終止正在執(zhí)行的任務。
  •  當線程池處于SHUTDOWN或STOP狀態(tài),并且所有工作線程已經(jīng)銷毀,任務緩存隊列已經(jīng)清空或執(zhí)行結(jié)束后,線程池被設(shè)置為TERMINATED狀態(tài)。

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

2.線程池的處理流程

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

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

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

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

配置線程池大小配置

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • Java實戰(zhàn)寵物醫(yī)院預約掛號系統(tǒng)的實現(xiàn)流程

    Java實戰(zhàn)寵物醫(yī)院預約掛號系統(tǒng)的實現(xiàn)流程

    只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql實現(xiàn)一個寵物醫(yī)院預約掛號系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • Java實現(xiàn)全圖背景水印的示例詳解

    Java實現(xiàn)全圖背景水印的示例詳解

    這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)全圖背景水印的方法,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-02-02
  • java實現(xiàn)一個簡單TCPSocket聊天室功能分享

    java實現(xiàn)一個簡單TCPSocket聊天室功能分享

    這篇文章主要為大家分享了java實現(xiàn)的一個簡單TCPSocket聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • java集合遍歷的幾種方式總結(jié)及詳細比較

    java集合遍歷的幾種方式總結(jié)及詳細比較

    下面小編就為大家?guī)硪黄猨ava集合遍歷的幾種方式總結(jié)及詳細比較。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • JVM進程緩存Caffeine的使用

    JVM進程緩存Caffeine的使用

    本文主要介紹了JVM進程緩存Caffeine的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • SpringBoot整合JPA方法及配置解析

    SpringBoot整合JPA方法及配置解析

    這篇文章主要介紹了SpringBoot整合JPA方法及配置過程,JPA是Java Persistence API的簡稱,中文名Java持久層API,感興趣想要詳細了解可以參考下文
    2023-05-05
  • SWT(JFace)體驗之List演示匯總

    SWT(JFace)體驗之List演示匯總

    SWT(JFace)體驗之List演示代碼匯總
    2009-06-06
  • Java之SpringCloud Eurka注冊錯誤解決方案

    Java之SpringCloud Eurka注冊錯誤解決方案

    這篇文章主要介紹了Java之SpringCloud Eurka注冊錯誤解決方案,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • JAVA實現(xiàn)連接本地打印機并打印文件的實現(xiàn)代碼

    JAVA實現(xiàn)連接本地打印機并打印文件的實現(xiàn)代碼

    這篇文章主要介紹了JAVA實現(xiàn)連接本地打印機并打印文件的實現(xiàn)代碼,需要的朋友可以參考下
    2019-10-10
  • spring boot啟動時加載外部配置文件的方法

    spring boot啟動時加載外部配置文件的方法

    這篇文章主要給大家介紹了關(guān)于spring boot啟動時加載外部配置文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02

最新評論