java執行緒池的總結
基本內容來自部落格,如果想通過原始碼去了解這些知識點,請點選:點選開啟連結
1.執行緒池數目
如果當前執行緒池中的執行緒數目小於corePoolSize,則每來一個任務,就會建立一個執行緒去執行這個任務;預設情況下,建立執行緒池之後,執行緒池中是沒有執行緒的,需要提交任務之後才會建立執行緒。
在實際中如果需要執行緒池建立之後立即建立執行緒,可以通過以下兩個方法辦到:
prestartCoreThread():初始化一個核心執行緒;
prestartAllCoreThreads():初始化所有核心執行緒
如果當前執行緒池中的執行緒數目>=corePoolSize,則每來一個任務,會嘗試將其新增到任務快取隊列當中,若新增成功,則該任務會等待空閒執行緒將其取出去執行;若添 加失敗(一般來說是任務快取佇列已滿),則會嘗試建立新的執行緒去執行這個任務;
如果當前執行緒池中的執行緒數目達到maximumPoolSize,則會採取任務拒絕策略進行處理;
如果執行緒池中的執行緒數量大於 corePoolSize時,如果某執行緒空閒時間超過keepAliveTime,執行緒將被終止,直至執行緒池中的執行緒數目不大於corePoolSize;如果允許為核心池中的執行緒設定存活時間,那麼核心池中的執行緒空閒時間超過keepAliveTime,執行緒也會被終止。2.任務快取佇列
在前面我們多次提到了任務快取佇列,即workQueue,它用來存放等待執行的任務。workQueue的型別為BlockingQueue<Runnable>,通常可以取下面三種類型:
1)ArrayBlockingQueue:基於陣列的先進先出佇列,此佇列建立時必須指定大小;
2)LinkedBlockingQueue:基於連結串列的先進先出佇列,如果建立時沒有指定此佇列大小,則預設為Integer.MAX_VALUE;
3)synchronousQueue:這個佇列比較特殊,它不會儲存提交的任務,而是將直接新建一個執行緒來執行新來的任務。
3.任務拒絕策略
當執行緒池的任務快取佇列已滿並且執行緒池中的執行緒數目達到maximumPoolSize,如果還有任務到來就會採取任務拒絕策略,通常有以下四種策略:
ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不丟擲異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
ThreadPoolExecutor.CallerRunsPolicy:由呼叫執行緒處理該任務
4.執行緒池的關閉
ThreadPoolExecutor提供了兩個方法,用於執行緒池的關閉,分別是shutdown()和shutdownNow(),其中:
shutdown():不會立即終止執行緒池,而是要等所有任務快取佇列中的任務都執行完後才終止,但再也不會接受新的任務
shutdownNow():立即終止執行緒池,並嘗試打斷正在執行的任務,並且清空任務快取佇列,返回尚未執行的任務
5.執行緒池容量的動態調整
ThreadPoolExecutor提供了動態調整執行緒池容量大小的方法:setCorePoolSize()和setMaximumPoolSize(),
setCorePoolSize:設定核心池大小
setMaximumPoolSize:設定執行緒池最大能建立的執行緒數目大小
當上述引數從小變大時,ThreadPoolExecutor進行執行緒賦值,還可能立即建立新的執行緒來執行任務。
6.Executors
不過在java doc中,並不提倡我們直接使用ThreadPoolExecutor,而是使用Executors類中提供的幾個靜態方法來建立執行緒池:
Executors.newCachedThreadPool(); //建立一個緩衝池,緩衝池容量大小為Integer.MAX_VALUE
Executors.newSingleThreadExecutor(); //建立容量為1的緩衝池
Executors.newFixedThreadPool(int); //建立固定容量大小的緩衝池
從它們的具體實現來看,它們實際上也是呼叫了ThreadPoolExecutor,只不過引數都已配置好了。
newFixedThreadPool建立的執行緒池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;
newSingleThreadExecutor將corePoolSize和maximumPoolSize都設定為1,也使用的LinkedBlockingQueue;
newCachedThreadPool將corePoolSize設定為0,將maximumPoolSize設定為Integer.MAX_VALUE,使用的SynchronousQueue,也就是說來了任務就建立執行緒執行,當執行緒空閒超過60秒,就銷燬執行緒。
實際中,如果Executors提供的三個靜態方法能滿足要求,就儘量使用它提供的三個方法,因為自己去手動配置ThreadPoolExecutor的引數有點麻煩,要根據實際任務的型別和數量來進行配置。
另外,如果ThreadPoolExecutor達不到要求,可以自己繼承ThreadPoolExecutor類進行重寫。
相關推薦
java 執行緒池總結
執行緒池1、分類1)、固定執行緒池ExecutorService executorService = Executors.newFixedThreadPool(10);2)、一個執行緒池ExecutorService executorService = Executors.n
Android之java執行緒池總結
執行緒池 Android培訓實戰教程裡面,耗時的網路操作,都會開子執行緒,在程式裡面直接開過多的執行緒會消耗過多的資源,在眾多的開源框架中也總能看到執行緒池的蹤影,所以執行緒池是必須要會把握的一個知識點; 執行緒執行機制 · 開啟執行緒過多,會消耗cpu
JAVA執行緒池總結
執行緒池和ThreadPoolExecutors 雖然在程式中可以直接使用Thread型別來進行執行緒操作,但是更多的情況是使用執行緒池,尤其是在Java EE應用伺服器中,一般會使用若干個執行緒池來處理來自客戶端的請求。Java中對於執行緒池的支援,來自ThreadPoolExecutor。一些應用伺
Java執行緒池總結筆記
早上看了篇不錯的介紹執行緒池的文章,細讀了下,筆記如下: 使用執行緒池的好處: 降低資源消耗提高響應速度提高執行緒可管理性執行緒飽和策略: AbortPolicy -直接丟擲異常CallerRunsPolicy -只用呼叫者所在的異常來執行任務DiscardOlde
【小家Java】一次Java執行緒池誤用(newFixedThreadPool)引發的線上血案和總結
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
總結下java執行緒池的處理策略
執行緒池 任務提交給執行緒池之後的處理策略: 如果當前執行緒池中的執行緒數目<corePoolSize,則每來一個任務,就會建立一個執行緒去執行這個任務; 如果當前執行緒池中的執行緒數目>=corePoolSize,則每來一個任務,會嘗試將其新增到任務快取隊列當中,若
Java執行緒池簡單總結
概述 執行緒可認為是作業系統可排程的最小的程式執行序列,一般作為程序的組成部分,同一程序中多個執行緒可共享該程序的資源(如記憶體等)。在單核處理器架構下,作業系統一般使用分時的方式實現多執行緒;在多核處理器架構下,多個執行緒能夠做到真正的在不同處理核心並行處理。
JAVA執行緒池精華總結
一. 為什麼用執行緒池(執行緒池的作用) 1. 建立/銷燬執行緒伴隨著系統開銷,過於頻繁的建立/銷燬執行緒,會很大程度上影響處理效率 例如: 記建立執行緒消耗時間T1,執行任務消耗時間T2,銷燬執行緒消耗時間T3 如果T1+T3>T2,那麼是不是說開啟一個執行
java執行緒池技術總結
1.Executor 執行緒池頂層介面,只有一個execute方法,void execute(Runnable command); 2.ExecutorService介面繼承於Executor介面 3.Executors 是操作Executor的工具類 Executo
java執行緒池的總結
基本內容來自部落格,如果想通過原始碼去了解這些知識點,請點選:點選開啟連結 1.執行緒池數目 如果當前執行緒池中的執行緒數目小於corePoolSize,則每來一個任務,就會建立一個執行緒去執行這個任務; 預設情況下,建立執行緒池之後,執行緒池中是沒有執行緒的,需要提交任
Java執行緒池用法總結
1、執行緒池 1) 建立測試執行緒 private static class MyThread extends Thread{ @Override public void run() { s
Java執行緒池(ThreadPoolFactory)構造引數總結
今天看到關於執行緒池的一篇帖子,是關於面試時問到ThreadPoolFactory構造器時的一些問題,之前博主也學習過一些關於ThreadPoolFactory構造器的問題,但是一直沒有總結過,既然今天有時間,那麼就總結一下,避免有些同學走彎路(有些工作多年的老
Java執行緒池的使用總結
Java中的執行緒池是運用場景最多的併發框架, 幾乎所有需要非同步或併發執行任務的程式都可以使用執行緒池。 在開發過程中, 合理地使用執行緒池能夠帶來3個好處。 第一: 降低資源消耗。 通過
Java執行緒池ThreadPoolExecutor面試總結思維導圖速記
## 優點 *** 1. 降低資源消耗,通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 2. 提高響應速度,當任務到達時,可以不需要等待執行緒建立就能立即執行。 3. 提高執行緒的可管理性 ## 類關係 *** 接 Executor 一個無返回值的execute方法 接 ExecutorServ
Java執行緒模型總結
1. 計算機系統 使用快取記憶體來作為記憶體與處理器之間的緩衝,將運算需要用到的資料複製到快取中,讓計算能快速進行;當運算結束後再從快取同步回記憶體之中,這樣處理器就無需等待緩慢的記憶體讀寫了。 快取一致性:多處理器系統中,因為共享同一主記憶體,當多個處理器的運算任務都設計到同一塊記憶體區域
java執行緒池詳細入門教程即原始碼解析
##1、執行緒池概念 執行緒池是執行緒的集合,通過執行緒池我們不需要自己建立執行緒,將任務提交給執行緒池即可。為什麼要使用執行緒池,首先,使用執行緒池可以重複利用已有的執行緒繼續執行任務,避免執行緒在建立和銷燬時造成的消耗。其次,由
Java執行緒池ThreadPoolExecutor詳解
1、執行緒池的工作原理? 執行緒池剛建立時,裡面沒有一個執行緒。任務佇列是作為引數傳進來的。不過,就算佇列裡面有任務,執行緒池也不會馬上執行它們。 當呼叫 execute() 方法新增一個任務時,執行緒池會做如下判斷:
java 執行緒池 ExecutorService相關歸納
public class ExecutorServiceDemo { public static void main(String[] args) { // 單執行緒池 &
Java執行緒池Executor框架詳解
Java的執行緒既是工作單元,也是執行機制。從JDK 5開始,把工作單元與執行機制分離開來。工作單元包括Runnable和Callable,而執行機制由Executor框架提供。 Executor框架簡介在HotSpot VM的執行緒模型中,Java執行緒(java.lang.Thread)被一對一對映為本
java執行緒池(有返回值和無返回值)
無返回值: package ThreadPool2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class test { public stat