溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

多線程(三、線程池原理)

發(fā)布時(shí)間:2020-10-18 05:39:05 來源:網(wǎng)絡(luò) 閱讀:643 作者:shayang88 欄目:編程語言

背景

阿里電面-線程池是如何實(shí)現(xiàn)的?這個問題的側(cè)重點(diǎn)是什么?

普通的數(shù)據(jù)庫連接池的概念一般是這樣的,多個被靜態(tài)代理或者動態(tài)代理生成的數(shù)據(jù)庫連接,直接放到一個池子里,比方說一個隊(duì)列,這個數(shù)據(jù)庫連接池提供了如下的方法:

多線程(三、線程池原理)

這是典型的池化的思想。

Java的線程池則不是這個池化的思想

Java的線程池是生產(chǎn)者-消費(fèi)者模式。

ThreadPoolExecutor的構(gòu)造函數(shù)很復(fù)雜,它的7個參數(shù)分別如下:

ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) 
corePoolSize,表示線程池保有的最小線程數(shù);
maximumPoolSize,表示線程池的最大線程數(shù)。
keepAliveTime&unit,如果一個線程空閑了keepAliveTime&unit的時(shí)間之后,而且線程數(shù)大于corePoolSize,那么這個線程就要被回了。
workQueue,工作隊(duì)列,注意這個隊(duì)列不是用來存放線程的,而是用來存放任務(wù)的,這個和其他池化的思想是不一樣的。
threadFactory,這個參數(shù)自定義創(chuàng)建線程,比方說指定線程的名字。
handler 如果線程都再忙碌或者任務(wù)隊(duì)列已滿,自定義任務(wù)的拒絕策略,一共4種,當(dāng)然1.6以后也支持通過方法allowsCoreThreadTimeOut 實(shí)現(xiàn)所有線程都能超時(shí)退出。

1、CallerRunsPolicy,提交任務(wù)的線程自己去執(zhí)行任務(wù)。
2、AbortPolicy 默認(rèn)的拒絕策略,拋出異常。
3、DiscardPolicy,直接丟棄任務(wù),不拋出異常。
4、DiscardOldestPolicy,丟棄最老的任務(wù),新任務(wù)增加到工作對列

那么線程池放到哪里了呢?

線程都放在了一個HashSet里面了

多線程(三、線程池原理)

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI