java 執行緒池簡介

2021-09-21 13:42:27 字數 2820 閱讀 2341

newfixedthreadpool(int nthreads)

初始化乙個指定執行緒數的執行緒池,其中核心執行緒數和最大執行緒數都為nthreads,使用linkedblockingquene作為阻塞佇列。

newcachedthreadpool()

初始化乙個可以快取執行緒的執行緒池,預設快取60s,核心執行緒數為0,最大執行緒數為integer.max_value,使用synchronousqueue作為阻塞佇列。在沒有任務執行時,當執行緒的空閒時間超過keepalivetime(60s),會自動釋放執行緒資源;當提交新任務時,如果沒有空閒執行緒,則建立新執行緒執行任務,會導致一定的系統開銷,因此,使用時要注意控制併發的任務數,防止因建立大量的執行緒導致而降低效能。

newsinglethreadexecutor()

初始化只有乙個執行緒的執行緒池,其中核心執行緒數等於最大執行緒數等於1,內部使用linkedblockingqueue作為阻塞佇列,唯一的執行緒可以保證所提交任務的順序執行(異常了會重新建立)。

newscheduledthreadpool(int corepoolsize)

初始化的執行緒池可以在指定的時間內週期性的執行所提交的任務,內部使用delayedworkqueue佇列,在實際的業務場景中可以使用該執行緒池定期的同步資料。

linkedblockingquene

是無界的,是乙個無界快取的阻塞佇列。基於鍊錶的阻塞佇列,內部維持著乙個資料緩衝佇列(該佇列由鍊錶構成)。當生產者往佇列中放入乙個資料時,佇列會從生產者手中獲取資料,並快取在佇列內部,而生產者立即返回;只有當佇列緩衝區達到最大值快取容量時(linkedblockingqueue可以通過建構函式指定該值),才會阻塞生產者佇列,直到消費者從佇列中消費掉乙份資料,生產者執行緒會被喚醒,反之對於消費者這端的處理也基於同樣的原理。

synchronousqueue

無界的,是一種無緩衝的阻塞佇列,乙個執行緒在新增時必須等待另外乙個執行緒取走,預設為非公平模式,也可以是公平模式。isempty()方法永遠返回是true,remainingcapacity() 方法永遠返回是0,remove()和removeall() 方法永遠返回是false,iterator()方法永遠返回空,peek()方法永遠返回null。

delayedworkqueue

無界阻塞佇列,只有在延遲期滿時才能從中提取元素。該佇列的頭部是延遲期滿後儲存時間最長的delayed元素。如果延遲都還沒有期滿,則佇列沒有頭部,並且poll將返回null。當乙個元素的 getdelay(timeunit.nanoseconds)方法返回乙個小於等於0的值時,將發生到期。即使無法使用take或poll移除未到期的元素,也不會將這些元素作為正常元素對待。例如,size方法同時返回到期和未到期元素的計數。此佇列不允許使用null元素。

arraylistblockingqueue

是有界的,是乙個有界快取的等待佇列。基於陣列的阻塞佇列,同linkedblockingqueue類似,內部維持著乙個定長資料緩衝佇列(該佇列由陣列構成)。arrayblockingqueue內部還儲存著兩個整形變數,分別標識著佇列的頭部和尾部在陣列中的位置

threadpoolexecutor(corepoolsize,maxpoolsize,keepalivetime,timeunit,workqueue,threadfactory,handle);

corepoolsize:核心執行緒數

maxpoolsize:最大執行緒數

keepalivetime:執行緒存活時間(在corepore《當前執行緒數threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常。

threadpoolexecutor.discardpolicy:丟棄任務,但是不丟擲異常。

threadpoolexecutor.discardoldestpolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)

threadpoolexecutor.callerrunspolicy:由呼叫執行緒處理該任務

當然也可以根據應用場景實現rejectedexecutionhandler介面,自定義拒絕策略,如記錄日誌或持久化儲存不能處理的任務。

executor.execute(runnable command);沒有返回值

executorservice.submit(callabletask);返回future物件

future物件包括以下方法

//取消任務

boolean cancel(boolean mayinterruptifrunning);

//是否取消成功

boolean iscancelled();

//是否執行完成

boolean isdone();

//獲取返回結果(如果任務沒有結束會阻塞)

v get();

//超時等待返回結果

v get(long timeout, timeunit unit);

threadpoolexecutor提供了兩個方法,用於執行緒池的關閉

shutdown():不會立即終止執行緒池,而是要等所有任務快取佇列中的任務都執行完後才終止,但再也不會接受新的任務

shutdownnow():立即終止執行緒池,並嘗試打斷正在執行的任務,並且清空任務快取佇列,返回尚未執行的任務

new(新建)、runnable(執行)、blocked(鎖池)、timed_waiting(定時等待)、waiting(等待)、terminated(終止、結束)

執行緒池簡介

本文 這裡 什麼是執行緒池?諸如web伺服器 資料庫伺服器 檔案伺服器和郵件伺服器等許多伺服器應用都面向處理來自某些遠端 的大量短小的任務。構建伺服器應用程式的乙個過於簡單的模型是 每當乙個請求到達就建立乙個新的服務物件,然後在新的服務物件中為請求服務。但當有大量請求併發訪問時,伺服器不斷的建立和銷...

Java執行緒池

executors類詳解 此包中所定義的 executor executorservice scheduledexecutorservice threadfactory 和 callable 類的工廠和實用方法。此類支援以下各種方法 建立並返回設定有常用配置字串的 executorservice 的...

Java執行緒池

一 執行緒池 單執行緒 public static void runsinglethreadpool public static void runsinglethreadpoolwithfactory private static class mythreadfactory implements t...