Java手動配置線程池過程詳解
線程池中,常見有涉及到的:
ExecutorService executorService = Executors.newSingleThreadExecutor();
ExecutorService executorService1 = Executors.newCachedThreadPool();
ExecutorService executorService2 = Executors.newFixedThreadPool(3);
關(guān)于Executors和ExecutorService從記憶上類似于Collections和List。
但是以上幾種其實(shí)不建議使用。最好可以通過自己手動配置ThreadPoolExecutor的形式。
我先創(chuàng)建一個(gè)demo:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
涉及7個(gè)參數(shù),按順序分別是
int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler
具體我首先需要結(jié)合參數(shù)解釋下線程池的執(zhí)行原理:
畫了張圖:

如果我用銀行辦理業(yè)務(wù)示例說明如下:
1、首先銀行里面有兩個(gè)柜臺,這就是核心線程數(shù)(7大參數(shù)之一)。
2、然后隨著客戶的增加,可能這個(gè)兩個(gè)柜臺滿了,然后就要請用戶到等候區(qū)里面進(jìn)行等待。這個(gè)等候區(qū)就是相當(dāng)于阻塞隊(duì)列(七大參數(shù)之一)。
3、然后緊接著客戶越來越多,連阻塞隊(duì)列都撐不住了,這個(gè)時(shí)候,就要請求,上面的領(lǐng)導(dǎo)進(jìn)行多增加柜臺的操作,這個(gè)時(shí)候,可能加了三個(gè)柜臺,現(xiàn)在就有5個(gè)柜臺了。這個(gè)時(shí)候最大的線程數(shù)(七大參數(shù)之一)就是5了。
4、但是這個(gè)時(shí)候可能客戶又越來越多,這個(gè)時(shí)候新加的柜臺也受不了,就要開始有拒絕策略了(七大參數(shù)之一)
5、然后過了一段時(shí)間,慢慢的,客戶越來越少了,這個(gè)時(shí)候,發(fā)現(xiàn)漸漸的,柜臺空余出來了。KeepAliveTime(七大參數(shù)之一,加上單位,合計(jì)兩個(gè)參數(shù))指當(dāng)線程數(shù)大于核心線程數(shù)時(shí),此為終止前多余的空閑線程等待新任務(wù)的最長時(shí)間。
6、還有一個(gè)參數(shù)是工廠,這個(gè)我們不做深入研究,直接用默認(rèn)的工廠即可。
懂得原理以后,我們可以查看下,為什么最好不要直接用,比如:
Executors.newFixedThreadPool(3);
這個(gè)的主要原因就是這里面默認(rèn)隊(duì)列的最大值是Integer的最大值。


所以我們生產(chǎn)中需要自己配置線程池。因?yàn)槟J(rèn)隊(duì)列的長度太長了,有可能會導(dǎo)致oom。就是內(nèi)存炸掉了。
這個(gè)在阿里的編程思想里面也有說明這一點(diǎn):

這邊我們探討下,拒絕策略。4種策略。就是所有柜臺和等候區(qū)全部滿了。會如何處理。
用非常easy的代碼來過下,這塊的內(nèi)容:
1、AbortPolicy
import java.util.concurrent.*;
public class VolatileTest {
public static void main(String[] args) throws Exception {
ExecutorService executorService = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()
);
try {
for (int i = 0; i < 9; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"\t"+"辦理業(yè)務(wù)");
}
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}

可以看到如果超出的話直接掛了,阻止正常運(yùn)行。
2、CallerRunsPolicy
輸出

發(fā)現(xiàn)有一個(gè)退回main線程,被main線程處理。即會把任務(wù)退回至調(diào)用者。
3、DiscardOldestPolicy
這個(gè)將會等待時(shí)間最久的任務(wù)丟掉。
4、DiscardPolicy
多出來的任務(wù)會全部丟掉。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java線程池使用后到底要關(guān)閉嗎
- java中常見的6種線程池示例詳解
- java ThreadPool線程池的使用,線程池工具類用法說明
- JAVA 創(chuàng)建線程池的注意事項(xiàng)
- JAVA 自定義線程池的最大線程數(shù)設(shè)置方法
- java 定時(shí)器線程池(ScheduledThreadPoolExecutor)的實(shí)現(xiàn)
- Java判斷線程池線程是否執(zhí)行完畢
- Java線程池ThreadPoolExecutor原理及使用實(shí)例
- Java 線程狀態(tài)和等待喚醒機(jī)制和線程池的實(shí)現(xiàn)
- Java線程池用法實(shí)戰(zhàn)案例分析
- Java線程池運(yùn)行狀態(tài)監(jiān)控實(shí)現(xiàn)解析
- Java線程池的拒絕策略實(shí)現(xiàn)詳解
- java 優(yōu)雅關(guān)閉線程池的方案
相關(guān)文章
mybatis多對多查詢的實(shí)現(xiàn)(xml方式和注解方式)
本文主要介紹了mybatis多對多查詢的實(shí)現(xiàn),有xml方式和注解方式兩種,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Kafka producer端開發(fā)代碼實(shí)例
這篇文章主要介紹了Kafka producer端開發(fā)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
SpringBoot自動配置的實(shí)現(xiàn)原理
這篇文章主要介紹了詳解SpringBoot自動配置原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
使用ehcache三步搞定springboot緩存的方法示例
本次內(nèi)容主要介紹基于Ehcache 3.0來快速實(shí)現(xiàn)Spring Boot應(yīng)用程序的數(shù)據(jù)緩存功能。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
IDEA修改java文件后 不用重啟Tomcat服務(wù)便可實(shí)現(xiàn)自動更新
這篇文章主要介紹了IDEA修改java文件后 不用重啟Tomcat服務(wù)便可實(shí)現(xiàn)自動更新,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Gson中@JsonAdater注解的幾種方式總結(jié)
這篇文章主要介紹了Gson中@JsonAdater注解的幾種方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
java學(xué)生信息管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

