Spring 與 JDK 線程池的簡單使用示例詳解
1.配置自定義共享線程池(Spring線程池)
@Configuration
@EnableAsync
public class ThreadPoolConfig{
//主要任務(wù)的調(diào)度,計(jì)劃執(zhí)行
@Bean("taskScheduler")
public Executor createScheduler(){
// 創(chuàng)建一個線程池對象
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
// 定義一個線程池大小
scheduler.setPoolSize(100);
// 線程池名的前綴
scheduler.setThreadNamePrefix("taskScheduler-");
// 設(shè)置線程池關(guān)閉的時候等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean
scheduler.setWaitForTasksToCompleteOnShutdown(true);
// 設(shè)置線程池中任務(wù)的等待時間,如果超過這個時候還沒有銷毀就強(qiáng)制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住
scheduler.setAwaitTerminationSeconds(60);
// 線程池對拒絕任務(wù)的處理策略,當(dāng)線程池沒有處理能力的時候,該策略會直接在 execute 方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù);如果執(zhí)行程序已關(guān)閉,則會丟棄該任務(wù)
scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return scheduler;
}
//主要任務(wù)的執(zhí)行
@Bean("taskExecutor")
public Executor createExecutor(){
// 創(chuàng)建一個線程池對象
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心線程池大小
executor.setCorePoolSize(10);
//最大線程數(shù)
executor.setMaxPoolSize(30);
//隊(duì)列容量
executor.setQueueCapacity(100);
//活躍時間
executor.setKeepAliveSeconds(60);
//線程名字前綴
executor.setThreadNamePrefix("taskExecutor-");
// 設(shè)置線程池關(guān)閉的時候等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean
executor.setWaitForTasksToCompleteOnShutdown(true);
// 線程池對拒絕任務(wù)的處理策略,當(dāng)線程池沒有處理能力的時候,該策略會直接在 execute 方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù);如果執(zhí)行程序已關(guān)閉,則會丟棄該任務(wù)
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}2.編寫執(zhí)行任務(wù)對象與具體任務(wù)邏輯方法
@Component
public class TaskComponent{
@Async("taskExecutor")
public void doTaskExecutor() {
System.out.println("任務(wù)開始執(zhí)行?。?!");
//具體的執(zhí)行任務(wù)
//。。。。。。。
}
// //有返回值(ObjectVo為自己定義的返回類型)
//@Async("taskExecutor")
//public Future<ObjectVo> doTaskExecutor() {
// System.out.println("任務(wù)開始執(zhí)行?。?!");
// //具體的執(zhí)行任務(wù)
// //。。。。。。。
// ObjectVo result=new ObjectVo();
// return new AsyncResult<>(result);
//}
@Async("taskScheduler")
public void doTaskScheduler() {
System.out.println("任務(wù)開始調(diào)度?。?!");
//具體的調(diào)度任務(wù)
//。。。。。。。
}
// //有返回值(ObjectVo為自己定義的返回類型)
//@Async("taskScheduler")
//public Future<ObjectVo> doTaskScheduler() {
// System.out.println("任務(wù)開始調(diào)度!?。?);
// //具體的調(diào)度任務(wù)
// //。。。。。。。
// ObjectVo result=new ObjectVo();
// return new AsyncResult<>(result);
//}
}3.調(diào)用任務(wù)方法(在哪調(diào)用都可以,根據(jù)自己業(yè)務(wù)需求在合適的地方調(diào)用即可)
@Service
public class UserServiceImpl implements UserService{
@Autowired
private TaskComponent taskComponent;
//測試任務(wù)執(zhí)行與調(diào)用
@SneakyThrows
@Override
public void testTask(){
//沒有返回值
taskComponent.doTaskExecutor();
taskComponent.doTaskScheduler();
//有返回值
//Future<ObjectVo> executorResult = taskComponent.doTaskExecutor();
//Future<ObjectVo> schedulerResult = taskComponent.doTaskScheduler();
//System.out.println(executorResult.get());
//System.out.println(schedulerResult.get());
}
}===============Executors結(jié)構(gòu)========jdk自帶線程池==========
1.任務(wù)(Runnable,Callable)
2.任務(wù)的執(zhí)行(Executor,ExecutorService 接口,ThreadPoolExecutor,ScheduledThreadExecutor實(shí)現(xiàn)類)
3.計(jì)算結(jié)果(返回結(jié)果 Future接口,F(xiàn)utureTask實(shí)現(xiàn)類)
===============Executors現(xiàn)成的線程池========jdk自帶線程池====
1 Executors.FixedThreadPool 核心數(shù)=容納的最大線程數(shù)=N
無界隊(duì)列(當(dāng)隊(duì)列過多時,會造成無限循環(huán))
2 Executors.CachedThreadPool 容納的最大線程數(shù)=無界
主線程提交任務(wù)的速度高于 maximumPoolSize中線程處理任務(wù)的速度時 CachedThreadPool將會不斷的創(chuàng)建新的線程,
在極端情況下,
CachedThreadPool會因?yàn)閯?chuàng)建過多線程而耗盡CPU和內(nèi)存資源
3 Executors.SingleThreadExecutor 核心數(shù)=容納的最大線程數(shù)=1 始終保持只有一個線程在執(zhí)行
無界隊(duì)列(當(dāng)隊(duì)列過多時,會造成無限循環(huán))
===============自定義Executors===========jdk自帶線程池====================
ExecuteService threadPool = new ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler);
//設(shè)置線程池的前綴
ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setNameFormat("trhead-pool-%d").build();
//設(shè)置決絕策略
RejectedExecutionHandler:
AbortPolicy:拋出RejectedExecutionException
CallerRunsPolicy:直接在execute方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù)。
DiscardOldestPolicy:放棄最舊的未處理請求,重試execute。
DiscardPolicy:丟棄被拒絕的任務(wù)。
================處理流程===================jdk 與 spring =====================
1.核心線程池是否在執(zhí)行任務(wù),不在執(zhí)行就選一條線程執(zhí)行,否則查看核心線程池是否已滿
2.核心線程池是否滿,不滿則創(chuàng)建一條線程執(zhí)行,否值查看隊(duì)列是否已滿
3.隊(duì)列是否滿,隊(duì)列不滿加入隊(duì)列,否則查看線程池是否已滿
4.線程池是否已滿,線程池不滿創(chuàng)建一條線程池,否則根據(jù)決絕策略處理
# 1.當(dāng)一個任務(wù)被提交到線程池時,首先查看線程池的核心線程是否都在執(zhí)行任務(wù),否就選擇一條線程執(zhí)行任務(wù),是就執(zhí)行第二步。
# 2.查看核心線程池是否已滿,不滿就創(chuàng)建一條線程執(zhí)行任務(wù),否則執(zhí)行第三步。
# 3.查看任務(wù)隊(duì)列是否已滿,不滿就將任務(wù)存儲在任務(wù)隊(duì)列中,否則執(zhí)行第四步。
# 4.查看線程池是否已滿,不滿就創(chuàng)建一條線程執(zhí)行任務(wù),否則就按照策略(拒絕策略)處理無法執(zhí)行的任務(wù)。
到此這篇關(guān)于Spring 與 JDK 線程池的簡單使用的文章就介紹到這了,更多相關(guān)Spring 與 JDK 線程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot基礎(chǔ)學(xué)習(xí)之初識SpringBoot
今天帶大家學(xué)習(xí)Springboot基礎(chǔ)知識,文中有非常詳細(xì)的圖文解說及代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
java 通過cmd 調(diào)用命令啟動tomcat的操作
這篇文章主要介紹了java 通過cmd 調(diào)用命令啟動tomcat的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
詳解分別用Kotlin和java寫RecyclerView的示例
本篇文章主要介紹了詳解分別用Kotlin和java寫RecyclerView的示例,詳解分別用Kotlin和java寫RecyclerView的示例2017-12-12
SpringBoot整合Shiro兩種方式(總結(jié))
這篇文章主要介紹了SpringBoot整合Shiro兩種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
IDEA自帶Maven插件找不到settings.xml配置文件
IDEA自帶了Maven插件,最近發(fā)現(xiàn)了一個問題,IDEA自帶Maven插件找不到settings.xml配置文件,本文就來詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2023-11-11
ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例
這篇文章主要為大家介紹了ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
springboot創(chuàng)建多module項(xiàng)目的實(shí)例
這篇文章主要介紹了springboot創(chuàng)建多module項(xiàng)目的實(shí)例代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務(wù)
這篇文章主要介紹了詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10

