網站首頁 編程語言 正文
目錄
一、什么是線程池?
二、線程池的好處
三、線程池的執行流程
四、線程池的四種拒絕策略
一、什么是線程池?
線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,并處于多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。線程池中的線程由系統管理,程序員不需要費力于線程管理,可以集中精力處理應用程序任務。
二、線程池的好處
- 提高響應速度;
- 降低資源消耗,不用頻繁的創建和銷毀線程;
- 提高線程的可管理性。
三、線程池的執行流程
-
每過來一個任務會啟動一個核心線程去執行
-
當核心線程數用完后,會把新來的任務存入阻塞隊列中;
-
阻塞隊列存滿后,會再啟動超過核心線程數量到最大線程數量之間的線程;
-
當線程的數量達到最大線程數量,再來任務就啟動拒絕策略。
四、線程池的四種拒絕策略
策略 |
處理方式 |
AbortPolicy |
直接拋出異常 |
DiscardPolicy |
丟棄當前被拒絕的任務(而不拋出任何異常) |
DiscardOldestPolicy |
將工作隊列中最老的任務丟棄,然后重新嘗試接納被拒絕的任務 |
CallerRunsPolicy |
在客戶端線程中執行被拒絕的任務 |
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();
}//保證線程已經開始執行任務
//獲取當前線程池中線程的數量
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);
//關閉線程池
pool.shutdown();
}
}
1.AbortPolicy
線程池的默認策略,當線程池中核心線程數量、最大線程數量和阻塞隊列都滿時,才會啟動拒絕策略。AbortPolicy就是直接拋出異常。
?2.DiscardPolicy
Discardpolicy策略會拒絕執行新來的線程,但不拋出異常。
相同的代碼,可以看出DiscardPolicy和AbortPolicy的區別。
?3.DiscardOldestPolicy
DiscardOldestPolicy策略,會丟掉隊伍中最早的任務,來嘗試執行新來的任務。
?通過運行結果我們可以看出,新來的任務被執行了。
4.CallerRunsPolicy
CallerRunsPolicy策略不會像DiscardOldestPolicy一樣去丟掉線程池中的任務,它會在客戶端線程中執行被拒絕的任務。
由此我們可以看出,??CallerRunsPolicy策略下的任務并不會影響線程池中的其他任務。
以上就是線程池常用的四種策略,四種策略效果不同,可以在不同的場景中去設置不同類型的拒絕策略。
原文鏈接:https://blog.csdn.net/weixin_56373368/article/details/126442785
- 上一篇:數據庫基本增刪改查語法和多表連查的方式
- 下一篇:繼承關系下構造方法的訪問特點
相關推薦
- 2022-06-19 python?rsa和Crypto.PublicKey.RSA?模塊詳解_python
- 2022-06-12 python數據處理詳情_python
- 2022-06-08 HDFS免重啟掛載新磁盤_服務器其它
- 2022-04-04 Element ui NavMenu 導航菜單 template中的內容不顯示
- 2022-04-06 關于Redis數據庫三種持久化方案介紹_Redis
- 2022-06-24 使用Python獲取字典鍵對應值的兩種方法_python
- 2021-12-07 Linux下Hbase安裝配置教程_Linux
- 2022-12-10 C語言中如何實現桶排序_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支