java ThreadPoolExecutor 自定義執行緒池優勢
java併發執行緒池建議還是多多使用ThreadPoolExecutor的建構函式來設定自定義的執行緒池,先來看看這個建構函式的引數列表。
/**
* Creates a new {@code ThreadPoolExecutor} with the given initial
* parameters.
*
* @param corePoolSize the number of threads to keep in the pool, even
* if they are idle, unless {@code allowCoreThreadTimeOut} is set
* @param maximumPoolSize the maximum number of threads to allow in the
* pool
* @param keepAliveTime when the number of threads is greater than
* the core, this is the maximum time that excess idle threads
* will wait for new tasks before terminating.
* @param unit the time unit for the {@code keepAliveTime} argument
* @param workQueue the queue to use for holding tasks before they are
* executed. This queue will hold only the {@code Runnable}
* tasks submitted by the {@code execute} method.
* @param threadFactory the factory to use when the executor
* creates a new thread
* @param handler the handler to use when execution is blocked
* because the thread bounds and queue capacities are reached
* @throws IllegalArgumentException if one of the following holds:<br>
* {@code corePoolSize < 0}<br>
* {@code keepAliveTime < 0}<br>
* {@code maximumPoolSize <= 0}<br>
* {@code maximumPoolSize < corePoolSize}
* @throws NullPointerException if {@code workQueue}
* or {@code threadFactory} or {@code handler} is null
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
通過這些引數列表我們就可以實現一個自定義的執行緒池了。
1)執行緒池中核心執行緒數,
2)執行緒池中最大執行緒數,
3)執行緒池中執行緒的最大空閒時間,超過這個時間空閒執行緒將被回收。
4)阻塞佇列的定義,你可以設定是ArrayList還是LinkedList的阻塞佇列,
5)執行緒工廠,還可以使用自定義的執行緒工廠,使執行緒池中的執行緒打上你自己獨有的標籤,方便除錯。自定義執行緒工廠很簡單,只需要繼承ThreadFactory然後重寫newThread方法即可。
6)執行緒拒絕策略,典型的幾類執行緒池預設策略都是丟擲異常,其實你可以自定義執行緒拒絕策略,目前ThreadPoolExecutor為我們提供了4種策略,分別是:
A:ThreadPoolExecutor.AbortPolicy 直接丟擲異常
B:ThreadPoolExecutor.DiscardPolicy 丟棄當前被拒絕的任務(而不丟擲任何異常)
C:ThreadPoolExecutor.DiscardOldestPolicy 將緩衝區中最老的任務丟棄,然後重新嘗試接納被拒絕的任務
D:ThreadPoolExecutor.CallerRunsPolicy 在任務的提交方執行緒中執行被拒絕的任務
不滿足的話,自己還可以實現自定義的執行緒拒絕策略,實現方法也很簡單,只需要實現RejectedExecutionHandler介面中定義的方法即可。
利用上面提到的6個引數就可以實現一個自定義的執行緒池了。
這裡再說明一下什麼時候會觸發拒絕執行緒提交的handler,
1)池中執行緒數小於corePoolSize時,新任務都不排隊而是直接新增新執行緒。
2)池中執行緒數大於等於corePoolSize時,workQueue未滿,首選將新任務加入workQueue而不是新增新執行緒。
3)池中執行緒數大於等於corePoolSize時,workQueue已滿,但是執行緒數小於maximumPoolSize,新增新的執行緒來處理被新增的任務。
4)池中執行緒數大於等於corePoolSize,workQueue已滿,並且執行緒數大於等於maximumPoolSize時,新任務被拒絕,使用handler處理被拒絕的任務。
相關推薦
java ThreadPoolExecutor 自定義執行緒池優勢
java併發執行緒池建議還是多多使用ThreadPoolExecutor的建構函式來設定自定義的執行緒池,先來看看這個建構函式的引數列表。 /** * Creates a new {@code ThreadPoolExecutor} wi
八、JAVA多執行緒:執行緒池原理以及自定義執行緒池 ThreadPool
為什麼會需要執行緒池技術? (1)Thread是一個重量級的資源,它的建立,啟動以及銷燬都是比較耗費效能的;重複利用執行緒,減少執行緒建立,銷燬的開銷,是一種好的程式設計習慣。 (2)通過new Thread的方法建立執行緒難以管理,並且難以控制數量,執行緒的數量通常和系統的效能呈拋
java自定義執行緒池--ThreadPoolExecutors
public class MyThreadPool { public static void main(String[] args) { /** * 1.在使用有界佇列的時候:若有新的任務需要執行,如果執行緒池實際執行緒數小於corePoolSize核心執行緒數的時候,則優先建立執行緒。
Java自定義執行緒池和執行緒總數控制
1 概述池化是常見的思想,執行緒池是非常典型的池化的實現,《Java併發程式設計實戰》也大篇幅去講解了Java中的執行緒池。本文實現一個簡單的執行緒池。 2 核心類 【1】介面定義 public interface IThreadPool<Job extends
自定義執行緒池ThreadPoolExecutor
public ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQu
2.3四種執行緒連線池的配置和使用(和自定義執行緒池)
四種執行緒連線池的配置和使用 最終呼叫類和方法 {引數有 核心執行緒數目,最大執行緒數目,存活時間(當前執行緒執行完這個任務之後,等待下一個任務到來的最長等待時間。如果在這個時間內沒有新的任務來到,那當前執行緒就會退出),時間單位,等待佇列(用於存放待執行的任務)} public
Python 自定義執行緒池
"""思路1,將任務放在佇列 1)建立佇列:(初始化) 2)設定大小,執行緒池的最大容量 3)真實建立的執行緒 列表 4)空閒的執行緒數量2,著手開始處理任務 1)建立執行緒 2)空閒執行緒數量大於0,則不再建立執行緒 3)建立執行緒池的數量 不能高於
自定義執行緒池、內建執行緒池.md
自定義簡單執行緒池 python執行緒是可以重複利用的,如果呼叫的時候每次都建立一個執行緒,則太浪費資源了 我把多執行緒比作服務員,每次有客人來的時候,都分配一個專門的服務員去服務; 當客人走了之後,服務員回到空閒狀態,繼續等待新的客人 import threa
Spring Boot 基礎系列教程 | 第三十二篇:使用@Async實現非同步呼叫:自定義執行緒池
推薦 Spring Boot/Cloud 視訊: 在之前的Spring Boot基礎教程系列中,已經通過《Spring Boot中使用@Async實現非同步呼叫》一文介紹過如何使用@Async註解來實現非同步呼叫了。但是,對於這些非同步執行的控制是我們保障自身
自定義執行緒池Executors
在使用有界佇列時,若有新的任務需要執行,如果執行緒池實際執行緒數小於corePoolSize,則優先建立執行緒,若大於corePoolSize,則會將任務加入佇列,若佇列已滿,則在匯流排程數不大於maximumPoolSize的前提下,建立新的執行緒,若執行緒數
Executors提供的四種執行緒池和自定義執行緒池
執行緒池的思想是一種物件池的思想,開放一塊記憶體空間,裡面存放了眾多(未死亡)的執行緒,池中執行緒執行排程由池管理器來處理。當有執行緒任務時,從池中取一個,執行完畢,物件歸還給池。這樣可以避免反覆建立執行緒物件所帶來的效能開銷,節省了系統的資源。 一、固定大小
程式設計師過關斬將--自定義執行緒池來實現文件轉碼
背景 我司在很久之前,一位很久之前的同事寫過一個文件轉圖片的服務,具體業務如下: 使用者在客戶端上傳文件,可以是ppt,word,pdf 等格式,使用者上傳完成可以在客戶端預覽上傳的文件,預覽的時候採用的是圖片形式(不要和我說用別的方式預覽,現在已經來不及了) 當用戶把文件上傳到雲端之後(阿里雲),把文件相
自定義執行緒池影響的線上事故
作為一個牛逼的程式設計師,相信大家肯定是接觸過多執行緒的概念的。並且可能會在實際的工作中因為一些業務場景需要使用自定義執行緒池來執行批量的任務或對執行緒進行管理。同樣,我們專案中也存在一個兩個場景需要使用執行緒池。而這兩個場景分別為: 1、持續監聽某個外部介面的不間斷的返回資訊,其實就是長連結的阻塞介面,
池化技術——自定義執行緒池
目錄 池化技術——自定義執行緒池 1、為什麼要使用執行緒池? 1.1、池化技術的特點: 1.2、執行緒池的好處: 1.3、如何自定義一個執行緒池 2、三大方法
Java ExecutorService四種執行緒池及自定義ThreadPoolExecutor機制
一、Java 執行緒池 Java通過Executors提供四種執行緒池,分別為:1、newCachedThreadPool:建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。(執行緒最大併發數不可控制);執行緒池為無限大,當執行第二個任務時若第一個任務已經
Java併發程式設計:Java的四種執行緒池的使用,以及自定義執行緒工廠
目錄 引言 四種執行緒池 newCachedThreadPool:可快取的執行緒池 newFixedThreadPool:定長執行緒池 newSingleThreadExecutor:單執行緒執行緒池 newScheduledThreadPool:支援定時的定
Java的四種執行緒池的使用,以及自定義執行緒工廠
四種執行緒池 四種執行緒池分別是:newCachedThreadPool、newFixedThreadPool 、newScheduledThreadPool 和newSingleThreadExecutor ,下面對這幾個執行緒池一一講解。 newCachedThreadPool:可快取的執行緒
Java併發程式設計中四種執行緒池及自定義執行緒使用教程
引言 通過前面的文章,我們學習了Executor框架中的核心類ThreadPoolExecutor ,對於執行緒池的核心排程機制有了一定的瞭解,並且成功使用ThreadPoolExecutor 建立了執行緒池。 而在Java中,除了ThreadPoolExecutor ,Executor框
JAVA併發程式設計:執行緒池 ThreadPoolExecutor
生活 前期追深度,否則會華而不實,後期追廣度,否則會坐井觀天; 前言 在前面,我們已經對Thread有了比較深入的瞭解,並且已經學會了通過new Thread()來建立一個執行緒,並通過start方法來啟動一個執行緒,這種方法非常簡單,同樣也存在弊端: 1、每次通過new Thr
初識Java中的四大執行緒池和ThreadPoolExecutor的使用(歡迎指正)
初識Java中的四大執行緒池和ThreadPoolExecutor的使用(轉載+自身心得) 為什麼用執行緒池? 1.建立/銷燬執行緒伴隨著系統開銷,過於頻繁的建立/銷燬執行緒,會很大程度上影響處-理效率; 2.執行緒併發數量過多,搶佔系統資源從而導致阻塞; 3.對執行緒進行一些簡單的