網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
目錄
一、什么是線程池?
二、線程池的好處
三、線程池的執(zhí)行流程
四、線程池的四種拒絕策略
一、什么是線程池?
線程池是一種多線程處理形式,處理過(guò)程中將任務(wù)添加到隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)。線程池線程都是后臺(tái)線程。每個(gè)線程都使用默認(rèn)的堆棧大小,以默認(rèn)的優(yōu)先級(jí)運(yùn)行,并處于多線程單元中。如果某個(gè)線程在托管代碼中空閑(如正在等待某個(gè)事件),則線程池將插入另一個(gè)輔助線程來(lái)使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊(duì)列中包含掛起的工作,則線程池將在一段時(shí)間后創(chuàng)建另一個(gè)輔助線程但線程的數(shù)目永遠(yuǎn)不會(huì)超過(guò)最大值。超過(guò)最大值的線程可以排隊(duì),但他們要等到其他線程完成后才啟動(dòng)。線程池中的線程由系統(tǒng)管理,程序員不需要費(fèi)力于線程管理,可以集中精力處理應(yīng)用程序任務(wù)。
二、線程池的好處
- 提高響應(yīng)速度;
- 降低資源消耗,不用頻繁的創(chuàng)建和銷毀線程;
- 提高線程的可管理性。
三、線程池的執(zhí)行流程
-
每過(guò)來(lái)一個(gè)任務(wù)會(huì)啟動(dòng)一個(gè)核心線程去執(zhí)行
-
當(dāng)核心線程數(shù)用完后,會(huì)把新來(lái)的任務(wù)存入阻塞隊(duì)列中;
-
阻塞隊(duì)列存滿后,會(huì)再啟動(dòng)超過(guò)核心線程數(shù)量到最大線程數(shù)量之間的線程;
-
當(dāng)線程的數(shù)量達(dá)到最大線程數(shù)量,再來(lái)任務(wù)就啟動(dòng)拒絕策略。
四、線程池的四種拒絕策略
策略 |
處理方式 |
AbortPolicy |
直接拋出異常 |
DiscardPolicy |
丟棄當(dāng)前被拒絕的任務(wù)(而不拋出任何異常) |
DiscardOldestPolicy |
將工作隊(duì)列中最老的任務(wù)丟棄,然后重新嘗試接納被拒絕的任務(wù) |
CallerRunsPolicy |
在客戶端線程中執(zhí)行被拒絕的任務(wù) |
package policy;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
//for(;;);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--------------------");
}
};
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("aaaaaaaaaaaaa");
}
};
ThreadPoolExecutor pool = new ThreadPoolExecutor(1,
2,
10,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1),
Executors.defaultThreadFactory(),
new AbortPolicy());
//new DiscardPolicy());
//new DiscardOldestPolicy());
//new CallerRunsPolicy());
pool.execute(r);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}//保證線程已經(jīng)開(kāi)始執(zhí)行任務(wù)
//獲取當(dāng)前線程池中線程的數(shù)量
int size = pool.getPoolSize();
System.out.println(size);
pool.execute(r);
size = pool.getPoolSize();
System.out.println(size);
pool.execute(r);
size = pool.getPoolSize();
System.out.println(size);
pool.execute(r1);
size = pool.getPoolSize();
System.out.println(size);
//關(guān)閉線程池
pool.shutdown();
}
}
1.AbortPolicy
線程池的默認(rèn)策略,當(dāng)線程池中核心線程數(shù)量、最大線程數(shù)量和阻塞隊(duì)列都滿時(shí),才會(huì)啟動(dòng)拒絕策略。AbortPolicy就是直接拋出異常。
?2.DiscardPolicy
Discardpolicy策略會(huì)拒絕執(zhí)行新來(lái)的線程,但不拋出異常。
相同的代碼,可以看出DiscardPolicy和AbortPolicy的區(qū)別。
?3.DiscardOldestPolicy
DiscardOldestPolicy策略,會(huì)丟掉隊(duì)伍中最早的任務(wù),來(lái)嘗試執(zhí)行新來(lái)的任務(wù)。
?通過(guò)運(yùn)行結(jié)果我們可以看出,新來(lái)的任務(wù)被執(zhí)行了。
4.CallerRunsPolicy
CallerRunsPolicy策略不會(huì)像DiscardOldestPolicy一樣去丟掉線程池中的任務(wù),它會(huì)在客戶端線程中執(zhí)行被拒絕的任務(wù)。
由此我們可以看出,??CallerRunsPolicy策略下的任務(wù)并不會(huì)影響線程池中的其他任務(wù)。
以上就是線程池常用的四種策略,四種策略效果不同,可以在不同的場(chǎng)景中去設(shè)置不同類型的拒絕策略。
原文鏈接:https://blog.csdn.net/weixin_56373368/article/details/126442785
相關(guān)推薦
- 2022-09-13 Android?Camera實(shí)現(xiàn)旋轉(zhuǎn)角度_Android
- 2022-07-16 ffmpeg中AVFrame\AVPacket與自己的數(shù)據(jù)交互
- 2022-05-25 C++?自定義單向鏈表?ListNode詳情_(kāi)C 語(yǔ)言
- 2022-09-23 Python線程threading(Thread類)_python
- 2022-05-10 thymeleaf跳轉(zhuǎn)到響應(yīng)頁(yè)面(modelandview 中的view)
- 2022-10-24 React中DOM事件和狀態(tài)介紹_React
- 2022-07-14 Oracle中nvl()和nvl2()函數(shù)實(shí)例詳解_oracle
- 2022-09-09 通過(guò)jmeter壓測(cè)surging的方法_實(shí)用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支