偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面試突擊:說(shuō)一下線程池七個(gè)參數(shù)的含義?

開發(fā) 前端
線程池創(chuàng)建線程時(shí)調(diào)用的工廠方法,通過(guò)此方法可以設(shè)置線程的優(yōu)先級(jí)、線程命名規(guī)則以及線程類型(用戶線程還是守護(hù)線程)等。

所謂的線程池的 7 大參數(shù)是指,在使用 ThreadPoolExecutor 創(chuàng)建線程池時(shí)所設(shè)置的 7 個(gè)參數(shù),如以下源碼所示:

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
//...
}

這 7 個(gè)參數(shù)分別是:

  1. corePoolSize:核心線程數(shù)。
  2. maximumPoolSize:最大線程數(shù)。
  3. keepAliveTime:空閑線程存活時(shí)間。
  4. TimeUnit:時(shí)間單位。
  5. BlockingQueue:線程池任務(wù)隊(duì)列。
  6. ThreadFactory:創(chuàng)建線程的工廠。
  7. RejectedExecutionHandler:拒絕策略。

參數(shù)1:corePoolSize核

心線程數(shù):是指線程池中長(zhǎng)期存活的線程數(shù)。

這就好比古代大戶人家,會(huì)長(zhǎng)期雇傭一些“長(zhǎng)工”來(lái)給他們干活,這些人一般比較穩(wěn)定,無(wú)論這一年的活多活少,這些人都不會(huì)被辭退,都是長(zhǎng)期生活在大戶人家的。

參數(shù)2:maximumPoolSize

最大線程數(shù):線程池允許創(chuàng)建的最大線程數(shù)量,當(dāng)線程池的任務(wù)隊(duì)列滿了之后,可以創(chuàng)建的最大線程數(shù)。

這是古代大戶人家最多可以雇傭的人數(shù),比如某個(gè)節(jié)日或大戶人家有人過(guò)壽時(shí),因?yàn)榛钐?,僅靠“長(zhǎng)工”是完不成任務(wù),這時(shí)就會(huì)再招聘一些“短工”一起來(lái)干活,這個(gè)最大線程數(shù)就是“長(zhǎng)工”+“短工”的總?cè)藬?shù),也就是招聘的人數(shù)不能超過(guò) maximumPoolSize。

注意事項(xiàng)

最大線程數(shù) maximumPoolSize 的值不能小于核心線程數(shù) corePoolSize,否則在程序運(yùn)行時(shí)會(huì)報(bào) IllegalArgumentException 非法參數(shù)異常,如下圖所示:

參數(shù)3:keepAliveTime

空閑線程存活時(shí)間,當(dāng)線程池中沒有任務(wù)時(shí),會(huì)銷毀一些線程,銷毀的線程數(shù)=maximumPoolSize(最大線程數(shù))-corePoolSize(核心線程數(shù))。

還是以大戶人家為例,當(dāng)大戶人家比較忙的時(shí)候就會(huì)雇傭一些“短工”來(lái)干活,但等干完活之后,不忙了,就會(huì)將這些“短工”辭退掉,而 keepAliveTime 就是用來(lái)描述沒活之后,短工可以在大戶人家待的(最長(zhǎng))時(shí)間。

參數(shù)4:TimeUnit

時(shí)間單位:空閑線程存活時(shí)間的描述單位,此參數(shù)是配合參數(shù) 3 使用的。參數(shù) 3 是一個(gè) long 類型的值,比如參數(shù) 3 傳遞的是 1,那么這個(gè) 1 表示的是 1 天?還是 1 小時(shí)?還是 1 秒鐘?是由參數(shù) 4 說(shuō)了算的。TimeUnit 有以下 7 個(gè)值:

  • TimeUnit.DAYS:天
  • TimeUnit.HOURS:小時(shí)
  • TimeUnit.MINUTES:分
  • TimeUnit.SECONDS:秒
  • TimeUnit.MILLISECONDS:毫秒
  • TimeUnit.MICROSECONDS:微妙
  • TimeUnit.NANOSECONDS:納秒

參數(shù)5:BlockingQueue

阻塞隊(duì)列:線程池存放任務(wù)的隊(duì)列,用來(lái)存儲(chǔ)線程池的所有待執(zhí)行任務(wù)。它可以設(shè)置以下幾個(gè)值:

  • ArrayBlockingQueue:一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。
  • LinkedBlockingQueue:一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列。
  • SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,即直接提交給線程不保持它們。
  • PriorityBlockingQueue:一個(gè)支持優(yōu)先級(jí)排序的無(wú)界阻塞隊(duì)列。
  • DelayQueue:一個(gè)使用優(yōu)先級(jí)隊(duì)列實(shí)現(xiàn)的無(wú)界阻塞隊(duì)列,只有在延遲期滿時(shí)才能從中提取元素。
  • LinkedTransferQueue:一個(gè)由鏈表結(jié)構(gòu)組成的無(wú)界阻塞隊(duì)列。與SynchronousQueue類似,還含有非阻塞方法。
  • LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列。

比較常用的是 LinkedBlockingQueue,線程池的排隊(duì)策略和 BlockingQueue 息息相關(guān)。

參數(shù)6:ThreadFactory

線程工廠:線程池創(chuàng)建線程時(shí)調(diào)用的工廠方法,通過(guò)此方法可以設(shè)置線程的優(yōu)先級(jí)、線程命名規(guī)則以及線程類型(用戶線程還是守護(hù)線程)等。線程工廠的使用示例如下:

public static void main(String[] args) {
// 創(chuàng)建線程工廠
ThreadFactory threadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
// 創(chuàng)建線程池中的線程
Thread thread = new Thread(r);
// 設(shè)置線程名稱
thread.setName("Thread-" + r.hashCode());
// 設(shè)置線程優(yōu)先級(jí)(最大值:10)
thread.setPriority(Thread.MAX_PRIORITY);
//......
return thread;
}
};
// 創(chuàng)建線程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0,
TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
threadFactory); // 使用自定義的線程工廠
threadPoolExecutor.submit(new Runnable() {
@Override
public void run() {
Thread thread = Thread.currentThread();
System.out.println(String.format("線程:%s,線程優(yōu)先級(jí):%d",
thread.getName(), thread.getPriority()));
}
});
}

以上程序的執(zhí)行結(jié)果如下:

從上述執(zhí)行結(jié)果可以看出,自定義線程工廠起作用了,線程的名稱和線程的優(yōu)先級(jí)都是通過(guò)線程工廠設(shè)置的。

參數(shù)7:RejectedExecutionHandler

拒絕策略:當(dāng)線程池的任務(wù)超出線程池隊(duì)列可以存儲(chǔ)的最大值之后,執(zhí)行的策略。默認(rèn)的拒絕策略有以下 4 種:

  • AbortPolicy:拒絕并拋出異常。
  • CallerRunsPolicy:使用當(dāng)前調(diào)用的線程來(lái)執(zhí)行此任務(wù)。
  • DiscardOldestPolicy:拋棄隊(duì)列頭部(最舊)的一個(gè)任務(wù),并執(zhí)行當(dāng)前任務(wù)。
  • DiscardPolicy:忽略并拋棄當(dāng)前任務(wù)。

線程池的默認(rèn)策略是 AbortPolicy 拒絕并拋出異常。

總結(jié)

本文介紹了線程池的 7 大參數(shù):

  1. corePoolSize:核心線程數(shù),線程池正常情況下保持的線程數(shù),大戶人家“長(zhǎng)工”的數(shù)量。
  2. maximumPoolSize:最大線程數(shù),當(dāng)線程池繁忙時(shí)最多可以擁有的線程數(shù),大戶人家“長(zhǎng)工”+“短工”的總數(shù)量。
  3. keepAliveTime:空閑線程存活時(shí)間,沒有活之后“短工”可以生存的最大時(shí)間。
  4. TimeUnit:時(shí)間單位,配合參數(shù) 3 一起使用,用于描述參數(shù) 3 的時(shí)間單位。
  5. BlockingQueue:線程池的任務(wù)隊(duì)列,用于保存線程池待執(zhí)行任務(wù)的容器。
  6. ThreadFactory:線程工廠,用于創(chuàng)建線程池中線程的工廠方法,通過(guò)它可以設(shè)置線程的命名規(guī)則、優(yōu)先級(jí)和線程類型。
  7. RejectedExecutionHandler:拒絕策略,當(dāng)任務(wù)量超過(guò)線程池可以保存的最大任務(wù)數(shù)時(shí),執(zhí)行的策略。
責(zé)任編輯:武曉燕 來(lái)源: Java面試真題解析
相關(guān)推薦

2023-11-29 16:38:12

線程池阻塞隊(duì)列開發(fā)

2022-02-17 08:02:08

線程Java生命周期

2022-06-06 15:33:20

線程Java釋放鎖

2022-06-29 11:01:05

MySQL事務(wù)隔離級(jí)別

2022-09-27 21:14:54

Spring事務(wù)傳播機(jī)制

2021-06-02 11:25:18

線程池Java代碼

2022-09-05 07:06:59

BeanSpring

2022-05-18 07:43:09

Exchange交換器JUC

2022-01-13 06:59:40

HashMap底層面試

2022-07-20 07:29:55

TCPIP協(xié)議

2011-08-09 15:25:14

線程池數(shù)據(jù)庫(kù)連接池

2023-10-18 08:04:15

taskworker任務(wù)

2023-07-14 14:53:38

人工智能prompt

2022-07-28 11:33:23

數(shù)據(jù)分析經(jīng)驗(yàn)

2021-07-28 10:08:19

類加載代碼塊面試

2023-02-06 07:01:51

2023-09-12 14:56:13

MyBatis緩存機(jī)制

2022-03-21 07:40:08

線程池Executors方式

2022-03-02 07:36:37

池化技術(shù)Java線程池

2022-06-07 12:03:33

Java內(nèi)存模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)