成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
task是worker對象封裝的任務。如果當前worker對象上沒有任務就調用getTask去阻塞隊列拿任務,如果能拿到就處理任務。如果getTask返回null就跳出循環,進入processWorkerExit方法。

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

關于線程池的問題,大多數面試官會問線程池的幾個參數的含義,今天就直接聊一聊線程池ThreadPoolExecutor。

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

ThreadPoolExecutor初始化的時候一般會有7個參數:

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

ThreadPoolExecutor的工作原理:

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

再來看下線程池的標識:

線程池的標識有兩層含義:

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

底層是用按位分隔的設計方式將一個int類型的變量的32位進行分割,用高3位表示線程狀態,低29位表示線程數量。

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

按位分割的好處就是用一個變量表示兩個狀態,在修改的時候可以利用cas保證原子性。

Worker對象創建邏輯是由addWorker方法實現的。

addWorker方法邏輯:

retry;雙層循環

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

第二層循環主要是判斷線程數,如果是創建核心線程,就判斷是否達到corePoolSize,否則就判斷是否達到maximumPoolSize,如果達到就返回fasle不放行。

如果未達到就放行,放行的時候會利用cas更新線程數,如果更新成功則兩層循環結束,繼續下面的邏輯。

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

創建Worker對象

接下來就是創建Worker(任務),Worker類繼承aqs,封裝了線程工廠,初始化的時候會利用工廠創建一個線程,并且和傳進來的任務封裝為worker對象。

獲取線程池全局鎖(reentrylock作為線程池全局鎖),進行上鎖操作

將創建的worker加入workers集合,workers是一個hashset集合。

放入集合后就可以解鎖了

worker創建完成了,接下來就是啟動線程,啟動線程后就會執行worker中的run方法

run方法流程

這個方法中主要的邏輯是這段代碼

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

task是worker對象封裝的任務。如果當前worker對象上沒有任務就調用getTask去阻塞隊列拿任務,如果能拿到就處理任務。如果getTask返回null就跳出循環,進入processWorkerExit方法。

我們知道線程池中的任務是放在隊列中的,ThreadPoolExecutor中的隊列一般默認是阻塞隊列LinkedBlockingQueue,

getTask()方法會在這個隊列中拿任務,如果有任務就直接返回任務,如果此時隊列中無任務,當前線程會阻塞等待任務到來。

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

  1. processWorkerExit方法邏輯

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

拒絕策略:

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

其他了解:

線程監控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);
 }


責任編輯:武曉燕 來源: 碼農本農
相關推薦

2024-06-11 09:02:30

2021-06-01 10:49:22

線程池Java開發

2021-06-03 14:23:57

線程線程池JAVA

2022-01-17 07:32:34

Java參數方法

2020-09-03 06:42:12

線程安全CPU

2023-07-14 14:53:38

人工智能prompt

2022-03-09 07:35:24

線程池線程參數

2025-01-03 08:09:15

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統數據庫

2018-01-06 10:38:51

Ping抓包 ICMP協議

2021-11-26 08:07:16

MySQL SQL 語句數據庫

2023-11-01 13:48:00

反射java

2019-10-31 08:36:59

線程內存操作系統

2021-02-03 14:43:40

人工智能人臉識別

2022-09-28 18:16:34

JavaJDK

2021-08-17 10:08:44

HTML網站網絡

2018-12-11 12:52:00

閉源開源協議

2013-11-15 11:06:27

閉源開源

2020-11-04 16:00:22

文件系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩综合一区 | 日本一区二区不卡视频 | 亚洲精品68久久久一区 | 久久日韩粉嫩一区二区三区 | 亚洲在线久久 | 免费观看黄a一级视频 | 国产免费又色又爽又黄在线观看 | 免费观看成人鲁鲁鲁鲁鲁视频 | 一区二区成人 | 日本不卡一区二区三区 | 久久久一区二区 | av网站免费观看 | 精品久久久久久久久久久久久久 | 中文字幕一区二区三区四区 | 1区2区3区视频 | 天天干狠狠操 | 国产精品久久久久久久久免费软件 | 久国产 | 久久久精品综合 | 亚洲欧洲在线观看视频 | 久久久免费在线观看 | 啪啪精品 | 国产精品久久久久aaaa樱花 | 涩爱av一区二区三区 | 成人免费网视频 | 涩涩视频网站在线观看 | 国产在线资源 | 色天堂影院| 成人福利在线观看 | 国产有码 | 久久在线 | 久操亚洲 | 久久国产精品免费一区二区三区 | 久久一区精品 | 韩日av在线 | 国产精品毛片一区二区在线看 | 久草网在线视频 | 国产ts人妖另类 | 欧美精品1区 | 午夜视频在线 | 国产欧美日韩一区 |