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

一文帶你深入剖析Java線程池的前世今生

 更新時(shí)間:2022年10月18日 08:14:26   作者:一無(wú)是處的研究僧  
這篇文章主要帶大家介紹了深入剖析一下Java線程池的前世今生,了解線程池的原理以及為什么需要線程池。文中的示例代碼講解詳細(xì),需要的可以參考一下

由線程到線程池

線程在做什么

靈魂拷問(wèn):寫了那么多代碼,你能夠用一句話簡(jiǎn)練描述線程在干啥嗎?

public?class?Demo01?{

??public?static?void?main(String[]?args)?{
????var?thread?=?new?Thread(()?->?{
??????System.out.println("Hello?world?from?a?Java?thread");
????});
????thread.start();
??}
}

我們上面的這個(gè)用線程輸出字符串的代碼來(lái)進(jìn)行說(shuō)明。我們知道上面的Java代碼啟動(dòng)了一個(gè)線程,然后執(zhí)行lambda函數(shù),在以前沒(méi)有lambda表達(dá)式的時(shí)候我們可以使用匿名內(nèi)部類實(shí)現(xiàn),向下面這樣。

public?class?Demo01?{

??public?static?void?main(String[]?args)?{
????var?thread?=?new?Thread(new?Runnable()?{
??????@Override
??????public?void?run()?{
????????System.out.println("Hello?world?from?a?Java?thread");
??????}
????});
????thread.start();
??}
}

但是本質(zhì)上Java編譯器在編譯的時(shí)候都認(rèn)為傳遞給他的是一個(gè)對(duì)象,然后執(zhí)行對(duì)象的run方法。剛剛我們使用的Thread的構(gòu)造函數(shù)如下:

????public?Thread(Runnable?target)?{
????????this(null,?target,?"Thread-"?+?nextThreadNum(),?0);
????}

Thread在拿到這個(gè)對(duì)象的時(shí)候,當(dāng)我們執(zhí)行Threadstart方法的時(shí)候,會(huì)執(zhí)行到一個(gè)native方法start0

當(dāng)JVM執(zhí)行到這個(gè)方法的時(shí)候會(huì)調(diào)用操作系統(tǒng)給上層提供的API創(chuàng)建一個(gè)線程,然后這個(gè)線程會(huì)去解釋執(zhí)行我們之前給Thread對(duì)象傳入的對(duì)象的run方法字節(jié)碼,當(dāng)run方法字節(jié)碼執(zhí)行完成之后,這個(gè)線程就會(huì)退出。

看到這里我們仔細(xì)思考一下線程在做一件什么樣的事情,JVM給我們創(chuàng)建一個(gè)線程好像執(zhí)行完一個(gè)函數(shù)(run)的字節(jié)碼之后就退出了,線程的生命周期就結(jié)束了。確實(shí)是這樣的,JVM給我們提供的線程就是去完成一個(gè)函數(shù),然后退出(記住這一點(diǎn),這一點(diǎn)很重要,為你后面理解線程池的原理有很大的幫助)。事實(shí)上JVM在使用操作系統(tǒng)給他提供的線程的時(shí)候也是給這個(gè)線程傳遞一個(gè)函數(shù)地址,然后讓這個(gè)線程執(zhí)行完這個(gè)函數(shù)。只不過(guò)JVM給操作系統(tǒng)傳遞的函數(shù),這個(gè)函數(shù)的功能就是去解釋執(zhí)行字節(jié)碼,當(dāng)解釋執(zhí)行字節(jié)碼完成之后,這個(gè)函數(shù)也會(huì)退出(被系統(tǒng)回收)。

看到這里可以將線程的功能總結(jié)成一句話:執(zhí)行一個(gè)函數(shù),當(dāng)這個(gè)函數(shù)執(zhí)行完成之后,線程就會(huì)退出,然后被回收,當(dāng)然這個(gè)函數(shù)可以調(diào)用其他的函數(shù),可能你會(huì)覺(jué)得這句話非常簡(jiǎn)單,但是這句話會(huì)我們理解線程池的原理非常有幫助。

為什么需要線程池

上面我們已經(jīng)談到了,當(dāng)我們執(zhí)行start的方法的時(shí)候,最終會(huì)走到start0方法,這是一個(gè)native方法,JVM在執(zhí)行這個(gè)方法的時(shí)候會(huì)通過(guò)系統(tǒng)底層函數(shù)創(chuàng)建一個(gè)線程,然后去執(zhí)行run方法,這里需要注意,創(chuàng)建線程是需要系統(tǒng)資源的,比如說(shuō)內(nèi)存,因?yàn)椴僮飨到y(tǒng)是系統(tǒng)資源的管理者,因此一般需要系統(tǒng)資源的方法都需要操作系統(tǒng)的參與,因此創(chuàng)建線程需要操作系統(tǒng)的幫忙,而一旦需要操作系統(tǒng)介入,執(zhí)行代碼的狀態(tài)就需要從用戶態(tài)到內(nèi)核態(tài)轉(zhuǎn)換(內(nèi)核態(tài)能夠執(zhí)行許多用戶態(tài)不能夠執(zhí)行的指令),當(dāng)操作系統(tǒng)創(chuàng)建完線程之后有需要返回用戶態(tài),我們的代碼將繼續(xù)被執(zhí)行,整個(gè)過(guò)程像下面這樣。

從上圖可以看到我們需要兩次的上下文切換,同時(shí)還需要執(zhí)行一些操作系統(tǒng)的函數(shù),這個(gè)過(guò)程是非常耗時(shí)間的,如果在并發(fā)非常高的情況,我們頻繁的去生成線程然后銷毀,這對(duì)我們程序的性能影響還是非常大的。因此許許多多聰明的程序員就想能不能不去頻繁的創(chuàng)建線程而且也能夠完成我們的功能——我們創(chuàng)建線程的目的就是想讓我們的程序完成的更加快速,讓多個(gè)不同的線程同時(shí)執(zhí)行不同的任務(wù)。于是線程池就被創(chuàng)造出來(lái)了。線程池的結(jié)構(gòu)大致如下所示:

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

在前面我們已經(jīng)提到了關(guān)于線程池和線程比較重要的兩個(gè)點(diǎn):

  • 線程就是執(zhí)行一個(gè)函數(shù)。
  • 線程池當(dāng)中的線程可以執(zhí)行很多函數(shù),但是不會(huì)退出。

憑借你樸素的情感,你覺(jué)得如何實(shí)現(xiàn)上面兩個(gè)要求。答案就是在一個(gè)函數(shù)當(dāng)中進(jìn)行while循環(huán),然后不斷的從任務(wù)隊(duì)列當(dāng)中獲取任務(wù)函數(shù),然后進(jìn)行執(zhí)行,直到要求停止線程池當(dāng)中的線程的時(shí)候線程再進(jìn)行退出,整個(gè)過(guò)程的代碼大致如下所示:

??public?void?run()?{
????while?(!isStopped)?{
??????try?{
????????Runnable?task?=?tasks.take();
????????task.run();
??????}?catch?(InterruptedException?e)?{
????????//?do?nothing
??????}
????}
??}

關(guān)于線程池要有一部分細(xì)節(jié)也很重要,比如說(shuō)我們需要一個(gè)并發(fā)安全的阻塞隊(duì)列,如何保證所有線程正常退出等等,我們?cè)谙缕恼庐?dāng)中進(jìn)行實(shí)現(xiàn),而且將仔細(xì)分析這里面的細(xì)節(jié)。

總結(jié)

在本篇文章當(dāng)中主要給大家介紹了線程到線程池的演化過(guò)程,主要介紹線程池實(shí)現(xiàn)的基本原理,主要解讀了線程池背后的基本原理,希望大家有所收獲!

以上就是一文帶你深入剖析Java線程池的前世今生的詳細(xì)內(nèi)容,更多關(guān)于Java線程池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Java和Redis實(shí)現(xiàn)高效的短信防轟炸方案

    使用Java和Redis實(shí)現(xiàn)高效的短信防轟炸方案

    在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,短信驗(yàn)證碼已成為身份驗(yàn)證的重要手段,然而,這也帶來(lái)了"短信轟炸"的安全風(fēng)險(xiǎn)?-?惡意用戶利用程序自動(dòng)化發(fā)送大量短信請(qǐng)求,導(dǎo)致用戶被騷擾和企業(yè)短信成本激增,本文將詳細(xì)介紹如何使用Java和Redis實(shí)現(xiàn)高效的短信防轟炸解決方案,需要的朋友可以參考下
    2025-04-04
  • Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析

    Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Spring注解 - TX 聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot的java -jar命令啟動(dòng)原理解讀

    SpringBoot的java -jar命令啟動(dòng)原理解讀

    這篇文章主要介紹了SpringBoot的java -jar命令啟動(dòng)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Spring整合ehCache全過(guò)程

    Spring整合ehCache全過(guò)程

    這篇文章主要介紹了Spring整合ehCache全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 完美解決PermGen space異常的問(wèn)題

    完美解決PermGen space異常的問(wèn)題

    這篇文章主要介紹了完美解決PermGen space異常的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • java基礎(chǔ)二叉搜索樹圖文詳解

    java基礎(chǔ)二叉搜索樹圖文詳解

    二叉樹是一種非常重要的數(shù)據(jù)結(jié)構(gòu),它同時(shí)具有數(shù)組和鏈表各自的特點(diǎn),下面這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)二叉搜索樹的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析

    Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析

    這篇文章主要介紹了Java中時(shí)間戳的獲取和轉(zhuǎn)換的示例分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • java使用ZipInputStream實(shí)現(xiàn)讀取和寫入zip文件

    java使用ZipInputStream實(shí)現(xiàn)讀取和寫入zip文件

    zip文檔可以以壓縮格式存儲(chǔ)一個(gè)或多個(gè)文件,本文主要為大家詳細(xì)介紹了java如何使用ZipInputStream讀取Zip文檔與寫入,需要的小伙伴可以參考下
    2023-11-11
  • java類加載器和類反射使用示例

    java類加載器和類反射使用示例

    這篇文章主要介紹了java類加載器和類反射使用示例,需要的朋友可以參考下
    2014-03-03
  • Java多線程之線程安全問(wèn)題詳情

    Java多線程之線程安全問(wèn)題詳情

    這篇文章主要介紹了Java多線程之線程安全問(wèn)題詳情,線程安全問(wèn)題是指因多線程搶占式執(zhí)行而導(dǎo)致程序出現(xiàn)bug的問(wèn)題。內(nèi)容介紹詳細(xì)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06

最新評(píng)論

桂平市| 龙州县| 策勒县| 鹤庆县| 黄山市| 壤塘县| 云南省| 游戏| 嘉荫县| 宾阳县| 万荣县| 邯郸县| 海宁市| 资中县| 五家渠市| 阳春市| 衡阳县| 泸西县| 阿克苏市| 兴文县| 甘洛县| 武功县| 息烽县| 宿松县| 铁力市| 子长县| 武义县| 盐城市| 响水县| 屏东市| 宁南县| 安徽省| SHOW| 盐亭县| 都昌县| 蓬安县| 台前县| 灵石县| 井研县| 广河县| 浙江省|