欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

不同點

連接池:

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

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

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

線程池:

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

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

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

相同點

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

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

分析一般從幾個角度考慮:

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

在這里插入圖片描述

cpu密集型

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

IO密集型

任務(wù)盡量加大線程數(shù),因為io不占用cpu的資源。比如像 MySQL 數(shù)據(jù)庫、文件的讀寫、網(wǎng)絡(luò)通信等任務(wù),這類任務(wù)不會特別消耗 CPU 資源,但是 IO 操作比較耗時,會占用比較多時間。可以使用稍大的線程池,一般為CPU核心數(shù) * 2。IO密集型任務(wù)CPU使用率并不高,因此可以讓CPU在等待IO的時候有其他線程去處理別的任務(wù),充分利用CPU時間。

混合型

盡量根據(jù)實際情況進行拆分,根據(jù)運行時間來決定。

可見,線程的平均工作時間所占比例越高,就需要越少的線程;線程的平均等待時間所占比例越高,就需要越多的線程;

追問1:核心線程數(shù)量過大或過小會造成什么后果?

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

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

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

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

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

在這里插入圖片描述

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

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

追問1:什么條件下會進入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é)

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

相關(guān)文章

  • 使用springMVC通過Filter實現(xiàn)防止xss注入

    使用springMVC通過Filter實現(xiàn)防止xss注入

    這篇文章主要介紹了使用springMVC通過Filter實現(xiàn)防止xss注入的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 反射機制詳解及實例代碼

    Java 反射機制詳解及實例代碼

    本文主要介紹Java 反射機制的知識,這里提供示例代碼幫助大家學(xué)習(xí)理解此部分知識,有需要的小伙伴可以參考下
    2016-09-09
  • SpringBoot集成screw實現(xiàn)數(shù)據(jù)庫文檔生成的代碼示例

    SpringBoot集成screw實現(xiàn)數(shù)據(jù)庫文檔生成的代碼示例

    數(shù)據(jù)庫設(shè)計文檔是項目技術(shù)文檔的重要組成部分,Screw 是一款開源的數(shù)據(jù)庫文檔生成工具,它支持多種數(shù)據(jù)庫類型,并能生成豐富格式的文檔,本文將通過一個實際的例子,展示如何使用 Spring Boot 集成 Screw 生成數(shù)據(jù)庫設(shè)計文檔
    2024-07-07
  • 兩個例子了解java中的回調(diào)機制

    兩個例子了解java中的回調(diào)機制

    這篇文章主要介紹了Java中回調(diào)機制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • java通過反射創(chuàng)建對象并調(diào)用方法

    java通過反射創(chuàng)建對象并調(diào)用方法

    這篇文章主要介紹了java通過反射創(chuàng)建對象并調(diào)用方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java中Easyexcel?實現(xiàn)批量插入圖片功能

    Java中Easyexcel?實現(xiàn)批量插入圖片功能

    這篇文章主要介紹了Easyexcel?實現(xiàn)批量插入圖片,本文通過實例代碼給大家介紹了easyexcel文檔處理工具、自定義圖片處理器的相關(guān)知識,需要的朋友可以參考下
    2022-04-04
  • Java中的事件處理機制詳解

    Java中的事件處理機制詳解

    這篇文章主要介紹了Java中的事件處理機制詳解,Java事件處理是采取"委派事件模型",當事件發(fā)生時,產(chǎn)生事件的對象,會把此"信息"傳遞給"事件的監(jiān)聽者"處理,這里所說的"信息"實際上就是java.awt.event事件類庫里某個類創(chuàng)建對象,需要的朋友可以參考下
    2023-09-09
  • java模擬http請求的錯誤問題整理

    java模擬http請求的錯誤問題整理

    本文是小編給大家整理的在用java模擬http請求的時候遇到的錯誤問題整理,以及相關(guān)分析,有興趣的朋友參考下。
    2018-05-05
  • springboot配置數(shù)據(jù)庫密碼特殊字符報錯的解決

    springboot配置數(shù)據(jù)庫密碼特殊字符報錯的解決

    這篇文章主要介紹了springboot配置數(shù)據(jù)庫密碼特殊字符報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java基礎(chǔ)第三篇 構(gòu)造器與方法重載

    Java基礎(chǔ)第三篇 構(gòu)造器與方法重載

    顯式初始化要求我們在寫程序時就確定初始值,這有時很不方便。我們可以使用構(gòu)造器(constructor)來初始化對象。構(gòu)造器可以初始化數(shù)據(jù)成員,還可以規(guī)定特定的操作。這些操作會在創(chuàng)建對象時自動執(zhí)行。下面文字將對該內(nèi)容做詳細介紹,需要的小伙伴請參考
    2021-09-09

最新評論