執行緒池基本原理
執行緒池的原理如下圖:
- 目前執行的執行緒少於corePoolSize,則建立新執行緒來執行任務。
- 執行的執行緒等於或多於corePoolSize,則將任務新增至佇列。
- 當任務佇列已滿,則在非corePool中建立新的執行緒來處理任務。
- 建立新執行緒將使目前執行的執行緒超出maximumPoolSize,任務將被拒絕,並呼叫RejectedExecutionHandler.rejectedExecution()方法。
public static class AbortPolicy implements RejectedExecutionHandler { public AbortPolicy() { } public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString()); } }說明:這種策略非常簡單粗暴,直接拋出RejectedExecutionException異常,也不會執行後續的任務。 範例說明:
public class ThreadPoolTest { public static void main(String[] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 2, 5, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(1), new ThreadPoolExecutor.AbortPolicy()); //异步执行 for(int i=0; i<10;i++) { System.out.println("添加第"+i+"个任务"); threadPoolExecutor.execute(new TestThread("线程"+i)); } } } public class TestThread implements Runnable { private String name; public TestThread(String name){ this.name=name; } @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread name:"+Thread.currentThread().getName()+",执行:"+name); } }執行結果:
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.skywares.fw.juc .thread.TestThread@55f96302 rejected from java.util.concurrent.ThreadPoolExecutor@3d4eac69[Running, pool size = 5, active threads = 5, queued tasks = 1, completed tas. ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823) > PoolExecutor.java: 1369)
從執行結果我們得知,採用AbortPolicy策略當任務執行到第七個任務時會直接報錯,導致後續的業務邏輯不會執行。
at com.skywares.fw.juc.thread.ThreadPoolTest.main(ThreadPoolTest.java:26)
thread name:pool-1-thread-5,執行:執行緒5
thread name:#thread name:pool-1-thread-5,執行:執行緒5
thread name: pool-1-thread-2,執行:執行緒1
thread name:pool-1-thread-4,執行:執行緒4
thread name:pool-1-thread-3,執行:執行緒3
thread name:pool-1-thread-1,執行:執行緒0
thread name:pool-1-thread-5,執行:執行緒2
CallerRunsPolicy
CallerRunsPolicy在任務被拒絕加入後,會用呼叫execute函數的上層執行緒去執行被拒絕的任務。
相關範例
public class ThreadPoolTest { public static void main(String[] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 2, 5, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(1), new ThreadPoolExecutor.CallerRunsPolicy()); //异步执行 for(int i=0; i<10;i++) { System.out.println("添加第"+i+"个任务"); threadPoolExecutor.execute(new TestThread("线程"+i)); } } }
執行結果:
新增第0個任務新增第1個任務所以此策略可能會阻塞主執行緒。新增第2個任務
從執行的結果我們可以得知,執行到第7個任務時,由於執行緒池拒絕策略,此任務由主執行緒執行,當執行緒池有空閒時,才繼續執行其他的任務。
新增第3個任務
新增第4個任務
新增第5個任務
新增第6個任務
thread name:main,執行:執行緒6
thread name:pool- 1-thread-3,執行:執行緒3
thread name:pool-1-thread-1,執行:執行緒0
thread name:pool-1-thread-4,執行:執行緒4
thread name:pool-1-thread-2,執行:執行緒1
thread name:pool-1-thread-5,執行:執行緒5
新增第7個任務
新增第8個任務
thread name:main,執行:執行緒8
thread name:pool-1-thread-1,執行:執行緒7
thread name:pool-1-thread-3,執行:執行緒2
添加第9個任務
thread name:pool-1-thread-1,執行:執行緒9
DiscardPolicy
這種拒絕策略比較簡單,執行緒池拒絕的任務直接拋棄,不會拋棄異常也不會執行
範例
修改上述的程式碼,將拒絕策略修改為DiscardPolicy
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 2, 5, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(1), new ThreadPoolExecutor.CallerRunsPolicy());
執行結果
invoke dealStock successgoodsId:手機thread name:pool-1- thread-1,執行:執行緒0
從執行的結果來看只執行了6個任務,其他的任務都被拋棄了。
thread name:pool-1-thread-4,執行:執行緒4
thread name:pool-1-thread-5,執行:執行緒5
thread name: pool-1-thread-3,執行:執行緒3
thread name:pool-1-thread-2,執行:執行緒1
thread name:pool-1-thread-1,執行:執行緒2
DiscardOldestPolicy
DiscardOldestPolicy 當任務拒絕新增時,會拋棄任務佇列中最先加入佇列的任務,再把新任務加入進去。
範例說明
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 1, 2, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(2), new ThreadPoolExecutor.CallerRunsPolicy());
執行結果:
新增第0個任務新增第1個任務新增第2個任務
新增第3個任務
新增第4個任務
新增第5個任務
invoke dealStock success
goodsId:手機
thread name:pool-1-thread-2,執行:執行緒3
thread name:pool-1-thread-1,執行:執行緒0
thread name:pool-1-thread-1,執行:執行緒2
thread name:pool-1-thread- 2,執行:線程1
自定义拒绝策略
当线程池提供的拒绝策略无法满足要求时,我们可以采用自定义的拒绝策略,只需要实现RejectedExecutionHandler接口即可
public class CustRejectedExecutionHandler implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { new Thread(r,"线程:"+new Random().nextInt(10)).start(); } } ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( 1, 2, 10, TimeUnit.MICROSECONDS, new LinkedBlockingDeque<>(2), new CustRejectedExecutionHandler());
执行结果:
thread name:客户线程:6,执行:线程5
thread name:pool-1-thread-1,执行:线程0
thread name:客户线程:8,执行:线程4
thread name:pool-1-thread-2,执行:线程3
thread name:pool-1-thread-1,执行:线程1
thread name:pool-1-thread-2,执行:线程2
从执行的结果来看,被拒绝的任务都在客户的新线程中执行。
小结
AbortPolicy:直接抛出异常,后续的任务不会执行
CallerRunsPolicy:子任务执行的时间过长,可能会阻塞主线程。
DiscardPolicy:不抛异常,任务直接丢弃
DiscardOldestPolicy;丢弃最先加入队列的任务
以上是如何實作Java ThreadPoolExecutor的拒絕策略?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版

Dreamweaver Mac版
視覺化網頁開發工具