日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

你真的了解線程池的七個參數是做什么的嗎?

來源: 責編: 時間:2023-10-18 09:18:28 266觀看
導讀問:可以說一下線程池嗎?關于線程池的問題,大多數面試官會問線程池的幾個參數的含義,今天就直接聊一聊線程池ThreadPoolExecutor。先說下線程池中幾個參數的含義:ThreadPoolExecutor初始化的時候一般會有7個參數:corePoolSiz

問:可以說一下線程池嗎?

關于線程池的問題,大多數面試官會問線程池的幾個參數的含義,今天就直接聊一聊線程池ThreadPoolExecutor。lTh28資訊網——每日最新資訊28at.com

先說下線程池中幾個參數的含義:

ThreadPoolExecutor初始化的時候一般會有7個參數:lTh28資訊網——每日最新資訊28at.com

  • corePoolSize:核心線程數
  • maximumPoolSize:最大線程數
  • keepAliveTime:非核心線程?;顣r間
  • unit:單位
  • workQueue:隊列
  • Executors.defaultThreadFactory():線程工場
  • 拒絕策略

ThreadPoolExecutor的工作原理:

往線程池中提交第一個任務,底層會創建第一個核心線程,將線程和任務封裝為一個woker對象放入set集合中,接下來每提交一個的任務都會對應創建一個核心線程和這個任務封裝的woker對象放入set集合中,直到核心線程數達到corePoolSize,再次提交到線程池的任務會被放到阻塞隊列排隊執行,如果放隊列的過程中,隊列滿了,就會創建一個非核心線程和這個任務封裝為woker對象放入set集合中,如果最終已經達到最大線程數maximumPoolSize,就采用拒絕策略。如果放入隊列過程中發現工作線程數位0,則創建一個空任務的Worker。lTh28資訊網——每日最新資訊28at.com

再來看下線程池的標識:

線程池的標識有兩層含義:lTh28資訊網——每日最新資訊28at.com

  • 一個含義是當前線程池中的線程數量;
  • 一個含義是當前線程池的狀態;

底層是用按位分隔的設計方式將一個int類型的變量的32位進行分割,用高3位表示線程狀態,低29位表示線程數量。lTh28資訊網——每日最新資訊28at.com

線程池的5個狀態:RUNNING= -1,正常運行狀態 SHUTDOWN= 0, 表示不接受新任務,只把隊列中的任務處理完結束。STOP= 1,表示不接受新任務,也不處理隊列中的任務了。IDYING= 2,非正常狀態 TERMINATED = 3,死亡狀態lTh28資訊網——每日最新資訊28at.com

按位分割的好處就是用一個變量表示兩個狀態,在修改的時候可以利用cas保證原子性。lTh28資訊網——每日最新資訊28at.com

Worker對象創建邏輯是由addWorker方法實現的。lTh28資訊網——每日最新資訊28at.com

addWorker方法邏輯:

retry;雙層循環

第一層循環主要判斷:如果當前線程池狀態為RUNNING就放行, 如果狀態為SHUTDOWN就必須滿足傳進來的新任務為null,隊列中有待處理的任務才會放行(因為SHUTDOWN狀態下不接受新任務,只處理隊列中的任務);如果狀態為STOP,IDYING,TERMINATED就一定不放行;lTh28資訊網——每日最新資訊28at.com

第二層循環主要是判斷線程數,如果是創建核心線程,就判斷是否達到corePoolSize,否則就判斷是否達到maximumPoolSize,如果達到就返回fasle不放行。lTh28資訊網——每日最新資訊28at.com

如果未達到就放行,放行的時候會利用cas更新線程數,如果更新成功則兩層循環結束,繼續下面的邏輯。lTh28資訊網——每日最新資訊28at.com

因為是cas操作,多線程的情況下可能會有更新線程數量失敗的情況,在這種情況下要判斷之前獲取的線程池狀態和現在的線程池狀態是否一致,如果不一致那就要重新判斷狀態,從而進入到外層循環的下一輪循環,如果一致就只需要進入到內層循環的下一輪循環。lTh28資訊網——每日最新資訊28at.com

創建Worker對象

接下來就是創建Worker(任務),Worker類繼承aqs,封裝了線程工廠,初始化的時候會利用工廠創建一個線程,并且和傳進來的任務封裝為worker對象。lTh28資訊網——每日最新資訊28at.com

獲取線程池全局鎖(reentrylock作為線程池全局鎖),進行上鎖操作lTh28資訊網——每日最新資訊28at.com

將創建的worker加入workers集合,workers是一個hashset集合。lTh28資訊網——每日最新資訊28at.com

放入集合后就可以解鎖了lTh28資訊網——每日最新資訊28at.com

worker創建完成了,接下來就是啟動線程,啟動線程后就會執行worker中的run方法lTh28資訊網——每日最新資訊28at.com

run方法流程

這個方法中主要的邏輯是這段代碼lTh28資訊網——每日最新資訊28at.com

while (task != null || (task = getTask()) != null){  邏輯}

task是worker對象封裝的任務。如果當前worker對象上沒有任務就調用getTask去阻塞隊列拿任務,如果能拿到就處理任務。如果getTask返回null就跳出循環,進入processWorkerExit方法。lTh28資訊網——每日最新資訊28at.com

我們知道線程池中的任務是放在隊列中的,ThreadPoolExecutor中的隊列一般默認是阻塞隊列LinkedBlockingQueue,lTh28資訊網——每日最新資訊28at.com

getTask()方法會在這個隊列中拿任務,如果有任務就直接返回任務,如果此時隊列中無任務,當前線程會阻塞等待任務到來。lTh28資訊網——每日最新資訊28at.com

但是如果設置了非核心線程最大空閑時間keepAliveTime,代表非核心線程的worker對象中的線程在拿任務的時候不會用take方法,而是用poll,poll這個方法可以設置阻塞等待時間為keepAliveTime。當超過這個時間還沒有任務就會返回null。lTh28資訊網——每日最新資訊28at.com

  1. processWorkerExit方法邏輯

上一步中如果沒有獲取到任務并且返回了null就會進入processWorkerExit方法。這個方法的邏輯就是把當前非核心線程的worker從workers集合中移除。最后會做一個判斷:如果此時沒有任何工作線程了,并且阻塞隊列中還有任務,那就再創建一個不帶任務的非核心線程worker。保證有線程去處理隊列中的任務。lTh28資訊網——每日最新資訊28at.com

拒絕策略:lTh28資訊網——每日最新資訊28at.com

  • AbortPolicy(默認):丟棄任務并拋出 RejectedExecutionException 異常。
  • CallerRunsPolicy:由調用線程處理該任務。
  • DiscardPolicy:丟棄任務,但是不拋出異常??梢耘浜线@種模式進行自定義的處理方式。
  • DiscardOldestPolicy:丟棄隊列最早的未處理任務,然后重新嘗試執行任務。

其他了解:lTh28資訊網——每日最新資訊28at.com

線程監控API: while (true) { System.out.println(); int queueSize = tpe.getQueue().size(); System.out.println("當前排隊線程數:" + queueSize); int activeCount = tpe.getActiveCount(); System.out.println("當前活動線程數:" + activeCount); long completedTaskCount = tpe.getCompletedTaskCount(); System.out.println("執行完成線程數:" + completedTaskCount); long taskCount = tpe.getTaskCount(); System.out.println("總線程數:" + taskCount); Thread.sleep(3000); }


lTh28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-13831-0.html你真的了解線程池的七個參數是做什么的嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Spring Boot的自動配置原理及示例說明

下一篇: 用Babel和Nodemon搭建一個功能齊全的Nodejs開發環境

標簽:
  • 熱門焦點
  • 直屏旗艦來了 iQOO 12和K70 Pro同臺競技

    旗艦機基本上使用的都是雙曲面屏幕,這就讓很多喜歡直屏的愛好者在苦等一款直屏旗艦,這次,你們等到了。據博主數碼閑聊站帶來的最新爆料稱,Redmi下代旗艦K70 Pro和iQOO 12兩款手
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 6月iOS設備好評榜:第一蟬聯榜首近一年

    作為安兔兔各種榜單里變化最小的那個,2023年6月的iOS好評榜和上個月相比沒有任何排名上的變化,僅僅是部分設備好評率的下降,長年累月的用戶評價和逐漸退出市場的老款機器讓這
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現“美團直播”的固定入口。在直播聚合頁面,外賣“神槍手”直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
Top 主站蜘蛛池模板: 巴楚县| 南岸区| 策勒县| 永德县| 山丹县| 涿鹿县| 密云县| 南投市| 兴义市| 临武县| 五河县| 盘锦市| 昌吉市| 建德市| 株洲县| 沙河市| 温宿县| 崇信县| 天台县| 高清| 仁布县| 阳泉市| 山西省| 思茅市| 庆安县| 晋中市| 嘉兴市| 丹凤县| 广安市| 金阳县| 唐河县| 永吉县| 抚顺县| 瓮安县| 英德市| 徐水县| 顺平县| 定远县| 宜兴市| 平顶山市| 瓦房店市|