Java手動(dòng)創(chuàng)建線程池代碼實(shí)例
Java手動(dòng)創(chuàng)建線程池代碼實(shí)例
使用ExecutorServices直接創(chuàng)建線程池的缺點(diǎn):
1. FixedThreadPool或者SingleThreadPool
允許的請(qǐng)求隊(duì)列長(zhǎng)度為Integer.MAX_VALUE,可能會(huì)堆積大量的請(qǐng)求,從而導(dǎo)致OOM。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}2.CachedThreadPool
允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會(huì)創(chuàng)建大量的線程,從而導(dǎo)致OOM。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}生產(chǎn)環(huán)境的做法
1. 創(chuàng)建線程工廠,指定創(chuàng)建線程時(shí)的線程名稱的命名規(guī)律
ThreadFactory nameThreadFactory = new ThreadFactoryBuilder().setNameFormat(“demo-pool-%d”).build();
2. 創(chuàng)建線程池 線程池在創(chuàng)建時(shí)可以不人為指定線程工廠,默認(rèn)使用的是DefaultThreadFactory
/** * 各參數(shù)含義 * corePoolSize : 線程池中常駐的線程數(shù)量。核心線程數(shù),默認(rèn)情況下核心線程會(huì)一直存活,即使處于閑置狀態(tài)也不會(huì) * 受存活時(shí)間 keepAliveTime 的限制,除非將 allowCoreThreadTimeOut 設(shè)置為 true。 * maximumPoolSize : 線程池所能容納的最大線程數(shù)。超過這個(gè)數(shù)的線程將被阻塞。當(dāng)任務(wù)隊(duì)列為沒有設(shè)置大小的 * LinkedBlockingQueue時(shí),這個(gè)值無效。 * keepAliveTime : 當(dāng)線程數(shù)量多于 corePoolSize 時(shí),空閑線程的存活時(shí)長(zhǎng),超過這個(gè)時(shí)間就會(huì)被回收 * unit : keepAliveTime 的時(shí)間單位 * workQueue : 存放待處理任務(wù)的隊(duì)列 * threadFactory : 線程工廠 * handler : 拒絕策略,拒絕無法接收添加的任務(wù) */
ExecutorService pool1 = new ThreadPoolExecutor( 5, 200, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024));
也可以人為的指定線程工廠
ExecutorService pool2 = new ThreadPoolExecutor( 5, 200 ,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
到此這篇關(guān)于Java手動(dòng)創(chuàng)建線程池代碼實(shí)例的文章就介紹到這了,更多相關(guān)Java線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis 數(shù)據(jù)封裝全攻略(告別空值與映射混亂問題)
本文系統(tǒng)介紹MyBatis數(shù)據(jù)封裝的常見問題及解決方案,涵蓋resultType、resultMap、駝峰轉(zhuǎn)換、嵌套處理、懶加載等核心機(jī)制,并推薦MyBatis-Plus簡(jiǎn)化開發(fā),提升效率與可維護(hù)性,感興趣的朋友跟隨小編一起看看吧2025-09-09
通過實(shí)例解析synchronized和lock區(qū)別
這篇文章主要介紹了通過實(shí)例解析synchronized和lock區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
Spring注解驅(qū)動(dòng)開發(fā)實(shí)現(xiàn)屬性賦值
這篇文章主要介紹了Spring注解驅(qū)動(dòng)開發(fā)實(shí)現(xiàn)屬性賦值,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
手把手教學(xué)Win10同時(shí)安裝兩個(gè)版本的JDK并隨時(shí)切換(JDK8和JDK11)
最近在學(xué)習(xí)JDK11的一些新特性,但是日常使用基本上都是基于JDK8,因此,需要在win環(huán)境下安裝多個(gè)版本的JDK,下面這篇文章主要給大家介紹了手把手教學(xué)Win10同時(shí)安裝兩個(gè)版本的JDK(JDK8和JDK11)并隨時(shí)切換的相關(guān)資料,需要的朋友可以參考下2023-03-03
SpringBoot中Flowable多數(shù)據(jù)源配置及事務(wù)沖突的兩種方案
本文詳細(xì)介紹了在SpringBoot項(xiàng)目中配置Flowable多數(shù)據(jù)源的實(shí)戰(zhàn)方案,重點(diǎn)解決事務(wù)沖突問題,通過傳播行為調(diào)整和自定義事務(wù)管理兩種方法,確保工作流引擎與業(yè)務(wù)系統(tǒng)數(shù)據(jù)隔離,感興趣的可以了解一下2026-03-03
SpringBoot應(yīng)用監(jiān)控Actuator使用隱患及解決方案
SpringBoot的Actuator 模塊提供了生產(chǎn)級(jí)別的功能,比如健康檢查,審計(jì),指標(biāo)收集,HTTP 跟蹤等,幫助我們監(jiān)控和管理Spring Boot 應(yīng)用,本文將給大家介紹SpringBoot應(yīng)用監(jiān)控Actuator使用隱患及解決方案,需要的朋友可以參考下2024-07-07
一文帶你掌握J(rèn)ava8中Lambda表達(dá)式 函數(shù)式接口及方法構(gòu)造器數(shù)組的引用
Java 8 (又稱為 jdk 1.8) 是 Java 語言開發(fā)的一個(gè)主要版本。 Oracle 公司于 2014 年 3 月 18 日發(fā)布 Java 8 ,它支持函數(shù)式編程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等2021-10-10
Map集合中獲取key-value值的實(shí)現(xiàn)方法
這篇文章主要介紹了Map集合中獲取key-value值的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

