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

Java面試題沖刺第二十五天--并發(fā)編程3

 更新時(shí)間:2021年08月27日 10:44:57   作者:_陳哈哈  
這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于并發(fā)編程的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下

面試題1:你了解線程池么?簡(jiǎn)單介紹一下。

java提供的一個(gè)java.util.concurrent.Executor接口的實(shí)現(xiàn)用于創(chuàng)建線程池。

線程池是一種多線程處理形式,處理過(guò)程中將任務(wù)提交到線程池,任務(wù)的執(zhí)行交由線程池來(lái)管理。如果每個(gè)請(qǐng)求都創(chuàng)建一個(gè)線程去處理,那么服務(wù)器的資源很快就會(huì)被耗盡,使用線程池可以減少創(chuàng)建和銷(xiāo)毀線程的次數(shù),每個(gè)工作線程都可以被重復(fù)利用,可執(zhí)行多個(gè)任務(wù)。

假設(shè)一個(gè)服務(wù)器完成一項(xiàng)任務(wù),創(chuàng)建線程時(shí)間T1 ,在線程中執(zhí)行任務(wù)的時(shí)間T2,銷(xiāo)毀線程時(shí)間為T(mén)3。如果:T1 + T3 遠(yuǎn)大于 T2,則可以采用線程池,大大縮短T1、T3時(shí)間,以提高服務(wù)器性能。

一個(gè)線程池包括以下四個(gè)基本組成部分: 

1.線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,銷(xiāo)毀線程池,添加新任務(wù);

2.工作線程(PoolWorker):線程池中線程,在沒(méi)有任務(wù)時(shí)處于等待狀態(tài),可以循環(huán)的執(zhí)行任務(wù);

3.任務(wù)接口(Task):每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行,它主要規(guī)定了任務(wù)的入口,任務(wù)執(zhí)行完后的收尾工作,任務(wù)的執(zhí)行狀態(tài)等;

4.任務(wù)隊(duì)列(taskQueue):用于存放沒(méi)有處理的任務(wù)。提供一種緩沖機(jī)制。

在這里插入圖片描述

當(dāng)線程池中有任務(wù)需要執(zhí)行時(shí),線程池會(huì)判斷如果池里的線程數(shù)沒(méi)有占滿就會(huì)新建線程池進(jìn)行任務(wù)執(zhí)行,如果線程池中的線程數(shù)量已經(jīng)超過(guò)核心線程數(shù),這時(shí)候任務(wù)就會(huì)被放入任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行;如果任務(wù)隊(duì)列也滿了,并且線程池沒(méi)有達(dá)到最大線程數(shù),就會(huì)新建非核心線程來(lái)執(zhí)行任務(wù);如果超過(guò)了最大線程數(shù),就會(huì)執(zhí)行飽和策略(拒絕執(zhí)行)。

追問(wèn)1:連接池 和 線程池是一個(gè)意思么?有什么區(qū)別?

不同點(diǎn)

連接池:

  • 連接池是面向數(shù)據(jù)庫(kù)連接的
  • 連接池是為了優(yōu)化數(shù)據(jù)庫(kù)連接資源
  • 連接池有點(diǎn)類(lèi)似在客戶端做優(yōu)化

數(shù)據(jù)庫(kù)連接是一項(xiàng)有限的昂貴資源,一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象均對(duì)應(yīng)一個(gè)物理數(shù)據(jù)庫(kù)連接,每次操作都打開(kāi)一個(gè)物理連接,使用完都關(guān)閉連接,這樣造成系統(tǒng)的性能低下。

數(shù)據(jù)庫(kù)連接池的解決方案是在應(yīng)用程序啟動(dòng)時(shí)建立足夠的數(shù)據(jù)庫(kù)連接,并將這些連接組成一個(gè)連接池,由應(yīng)用程序動(dòng)態(tài)地對(duì)池中的連接進(jìn)行申請(qǐng)、使用和釋放。對(duì)于多于連接池中連接數(shù)的并發(fā)請(qǐng)求,應(yīng)該在請(qǐng)求隊(duì)列中排隊(duì)等待。并且應(yīng)用程序可以根據(jù)池中連接的使用率,動(dòng)態(tài)增加或減少池中的連接數(shù)。

線程池:

  • 線程池是面向后臺(tái)程序的
  • 線程池是是為了提高內(nèi)存和CPU效率
  • 線程池有點(diǎn)類(lèi)似于在服務(wù)端做優(yōu)化

線程池是一次性創(chuàng)建一定數(shù)量的線程(應(yīng)該可以配置初始線程數(shù)量的),當(dāng)用請(qǐng)求過(guò)來(lái)不用去創(chuàng)建新的線程,直接使用已創(chuàng)建的線程,使用后又放回到線程池中。

避免了頻繁創(chuàng)建線程,及銷(xiāo)毀線程的系統(tǒng)開(kāi)銷(xiāo),提高是內(nèi)存和CPU效率。

相同點(diǎn)

都是事先準(zhǔn)備好資源,避免頻繁創(chuàng)建和銷(xiāo)毀的代價(jià)。

面試題2:線程池中核心線程數(shù)量大小你是怎么設(shè)置的?

分析一般從幾個(gè)角度考慮:

  • 任務(wù)的性質(zhì):CPU密集型的任務(wù)、IO密集型任務(wù)、混合型任務(wù)。
  • 任務(wù)的優(yōu)先級(jí):高、中、低
  • 任務(wù)執(zhí)行時(shí)間:長(zhǎng)、中、短
  • 任務(wù)的依賴性:是否依賴其它系統(tǒng)資源,如數(shù)據(jù)庫(kù)的連接等。

在這里插入圖片描述

cpu密集型

盡量減少線程數(shù);比如像加解密,壓縮、計(jì)算等一系列需要大量耗費(fèi) CPU 資源的任務(wù),大部分場(chǎng)景下都是純 CPU 計(jì)算。盡量使用較小的線程池,一般為CPU核心數(shù)+1。因?yàn)镃PU密集型任務(wù)使得CPU使用率很高,若開(kāi)過(guò)多的線程數(shù),會(huì)造成CPU過(guò)度切換。

IO密集型

任務(wù)盡量加大線程數(shù),因?yàn)閕o不占用cpu的資源。比如像 MySQL 數(shù)據(jù)庫(kù)、文件的讀寫(xiě)、網(wǎng)絡(luò)通信等任務(wù),這類(lèi)任務(wù)不會(huì)特別消耗 CPU 資源,但是 IO 操作比較耗時(shí),會(huì)占用比較多時(shí)間??梢允褂蒙源蟮木€程池,一般為CPU核心數(shù) * 2。IO密集型任務(wù)CPU使用率并不高,因此可以讓CPU在等待IO的時(shí)候有其他線程去處理別的任務(wù),充分利用CPU時(shí)間。

混合型

盡量根據(jù)實(shí)際情況進(jìn)行拆分,根據(jù)運(yùn)行時(shí)間來(lái)決定。

可見(jiàn),線程的平均工作時(shí)間所占比例越高,就需要越少的線程;線程的平均等待時(shí)間所占比例越高,就需要越多的線程;

追問(wèn)1:核心線程數(shù)量過(guò)大或過(guò)小會(huì)造成什么后果?

當(dāng)線程池中核心線程數(shù)量過(guò)大時(shí),線程與線程之間會(huì)爭(zhēng)取CPU資源,這樣就會(huì)導(dǎo)致上下文切換。過(guò)多的上下文切換會(huì)增加線程的執(zhí)行時(shí)間,影響了整體執(zhí)行的效率;

多線程編程中一般線程的個(gè)數(shù)都大于CPU核心的個(gè)數(shù),而一個(gè)CPU核心在任意時(shí)刻只能被一個(gè)線程使用,為了讓這些線程都能得到有效的執(zhí)行,CPU采取的策略是為了每個(gè)線程分配時(shí)間片并輪轉(zhuǎn)的形式。當(dāng)一個(gè)線程的時(shí)間片用完的時(shí)候就會(huì)重新處于就緒狀態(tài)讓其他線程使用,這個(gè)過(guò)程就屬于一次上下文切換。

當(dāng)線程池中的核心線程數(shù)量過(guò)少時(shí),如果統(tǒng)一時(shí)間有大量任務(wù)需要處理,可能會(huì)導(dǎo)致大量任務(wù)在任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行,甚至?xí)霈F(xiàn)隊(duì)列滿了之后任務(wù)無(wú)法執(zhí)行的情況,或者大量任務(wù)堆積在任務(wù)隊(duì)列導(dǎo)致內(nèi)存溢出(OOM)。

面試題3:線程池都有哪些狀態(tài)呀?

線程池的5種狀態(tài):Running、ShutDown、Stop、Tidying、Terminated。

在這里插入圖片描述

  • RUNNING:線程池的初始化狀態(tài)是RUNNING,能夠接收新任務(wù),以及對(duì)已添加的任務(wù)進(jìn)行處理。
  • SHUTDOWN:線程池處在SHUTDOWN狀態(tài)時(shí),不接收新任務(wù),但能處理已添加的任務(wù)。 調(diào)用線程池的shutdown()接口時(shí),線程池由RUNNING -> SHUTDOWN。
  • STOP:線程池處在STOP狀態(tài)時(shí),不接收新任務(wù),不處理已添加的任務(wù),并且會(huì)中斷正在處理的任務(wù)。 調(diào)用線程池的shutdownNow()接口時(shí),線程池由(RUNNING or SHUTDOWN ) -> STOP。
  • TIDYING:當(dāng)所有的任務(wù)已終止,ctl記錄的”任務(wù)數(shù)量”為0,線程池會(huì)變?yōu)門(mén)IDYING狀態(tài)。當(dāng)線程池變?yōu)門(mén)IDYING狀態(tài)時(shí),會(huì)執(zhí)行鉤子函數(shù)terminated()。terminated()在ThreadPoolExecutor類(lèi)中是空的,若用戶想在線程池變?yōu)門(mén)IDYING時(shí),進(jìn)行相應(yīng)的處理;可以通過(guò)重載terminated()函數(shù)來(lái)實(shí)現(xiàn)。
  • TERMINATED:線程池徹底終止,就變成TERMINATED狀態(tài)。線程池處在TIDYING狀態(tài)時(shí),執(zhí)行完terminated()之后,就會(huì)由 TIDYING -> TERMINATED。

  當(dāng)線程池在SHUTDOWN狀態(tài)下,阻塞隊(duì)列為空并且線程池中執(zhí)行的任務(wù)也為空時(shí),就會(huì)由 SHUTDOWN -> TIDYING。 當(dāng)線程池在STOP狀態(tài)下,線程池中執(zhí)行的任務(wù)為空時(shí),就會(huì)由STOP -> TIDYING。

追問(wèn)1:什么條件下會(huì)進(jìn)入TERMINATED狀態(tài)

  •  線程池不是RUNNING狀態(tài);
  • 線程池狀態(tài)不是TIDYING狀態(tài)或TERMINATED狀態(tài);
  • 如果線程池狀態(tài)是SHUTDOWN并且workerQueue為空;
  • workerCount為0;
  • 設(shè)置TIDYING狀態(tài)成功。

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java hasNextInt判斷是否為數(shù)字的方法

    java hasNextInt判斷是否為數(shù)字的方法

    今天小編就為大家分享一篇java hasNextInt判斷是否為數(shù)字的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • SpringBoot沒(méi)有主清單屬性的解決方法

    SpringBoot沒(méi)有主清單屬性的解決方法

    在本篇文章里小編給大家整理的是關(guān)于解決SpringBoot沒(méi)有主清單屬性知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-11-11
  • Java中關(guān)于http請(qǐng)求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn)

    Java中關(guān)于http請(qǐng)求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn)

    這篇文章主要介紹了Java中關(guān)于http請(qǐng)求獲取FlexManager某設(shè)備分組監(jiān)控點(diǎn),本文僅僅介紹了使用http請(qǐng)求獲取FlexManager平臺(tái)某個(gè)FBox盒子即某設(shè)備的監(jiān)控點(diǎn)分組的分組下的所有監(jiān)控點(diǎn)信息,需要的朋友可以參考下
    2022-10-10
  • 如何使用Java調(diào)用Linux系統(tǒng)命令

    如何使用Java調(diào)用Linux系統(tǒng)命令

    這篇文章主要介紹了如何使用Java調(diào)用Linux系統(tǒng)命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java SPEL表達(dá)式注入漏洞原理解析

    Java SPEL表達(dá)式注入漏洞原理解析

    SpEL簡(jiǎn)稱(chēng)Spring表達(dá)式語(yǔ)言,在Spring 3中引入,SpEL能在運(yùn)行時(shí)構(gòu)建復(fù)雜表達(dá)式、存取對(duì)象圖屬性、對(duì)象方法調(diào)用等等,可以與基于XML和基于注解的Spring配置還有bean定義一起使用,本文給大家介紹Java SPEL表達(dá)式注入漏洞原理研究,感興趣的朋友一起看看吧
    2023-10-10
  • IDEA?下?Gradle?刪除多余無(wú)用依賴的處理方法

    IDEA?下?Gradle?刪除多余無(wú)用依賴的處理方法

    這篇文章主要介紹了IDEA下Gradle刪除多余無(wú)用依賴,使用該插件可以一定程度上幫助我們刪除無(wú)用依賴,但是也可能會(huì)多刪除有用的依賴,需要在使用插件自動(dòng)修復(fù)后手動(dòng)檢測(cè)項(xiàng)目,驗(yàn)證是否會(huì)出現(xiàn)問(wèn)題,避免導(dǎo)致上線發(fā)布錯(cuò)誤的負(fù)優(yōu)化
    2022-03-03
  • java實(shí)現(xiàn)的冒泡排序算法示例

    java實(shí)現(xiàn)的冒泡排序算法示例

    這篇文章主要介紹了java實(shí)現(xiàn)的冒泡排序算法,結(jié)合實(shí)例形式分析了冒泡排序算法的具體操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • Java之while與do-while循環(huán)的用法詳解

    Java之while與do-while循環(huán)的用法詳解

    在上一篇文章中,給大家講解了循環(huán)的概念,并重點(diǎn)給大家講解了for循環(huán)的使用。但在Java中,除了for循環(huán)之外,還有while、do-while、foreach等循環(huán)形式。這篇文章給大家講解while循環(huán)的使用
    2023-05-05
  • Java中的共享鎖CountDownLatch及源碼解析

    Java中的共享鎖CountDownLatch及源碼解析

    這篇文章主要介紹了Java中的共享鎖CountDownLatch及源碼解析,CountDownLatch是一種同步輔助工具,允許一個(gè)或多個(gè)線程等待,直到在其它線程中執(zhí)行的一組操作完成;CountDownLatch使用指定的計(jì)數(shù)初始化,需要的朋友可以參考下
    2023-11-11
  • 關(guān)于Guava緩存詳解及使用說(shuō)明

    關(guān)于Guava緩存詳解及使用說(shuō)明

    這篇文章主要介紹了關(guān)于Guava緩存詳解及使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評(píng)論

和田县| 盱眙县| 磴口县| 呼玛县| 嵊州市| 巴马| 沧源| 荃湾区| 锦屏县| 象山县| 长春市| 施甸县| 荆州市| 长岭县| 龙里县| 游戏| 固原市| 新余市| 且末县| 永胜县| 祁门县| 陆良县| 信丰县| 金溪县| 大安市| 云林县| 景谷| 雷山县| 宁波市| 安化县| 固始县| 紫金县| 木里| 庆安县| 博湖县| 青州市| 东乡县| 大城县| 离岛区| 桂平市| 尚义县|