jdk執行緒池 Executor體系

2021-08-20 08:35:03 字數 3257 閱讀 8367

提供了乙個執行緒佇列,佇列中儲存著所有等待狀態的執行緒。避免了建立與銷毀額外開銷,提高了響應的速度。

executor : 負責執行緒的使用與排程的根介面  只有乙個execute(runnable)方法

executorservice 子介面:executorservice 繼承 executor,並宣告了一些方法:submit、invokeall、invokeany以及shutdown等

abstractexecutorservice:抽象介面 abstractexecutorservice 實現 executorservice,基本實現了executorservice中宣告的所有方法

threadpoolexecutor:執行緒池的實現類 threadpoolexecutor 繼承 abstractexecutorservice

scheduledexecutorservice 子介面:負責執行緒的排程 scheduledexecutorservice 繼承 executorservice

scheduledthreadpoolexecutor :繼承 threadpoolexecutor, 實現 scheduledexecutorservice

此類是執行緒池中最核心的乙個類 ,在threadpoolexecutor類中提供了四個構造方法:

public class threadpoolexecutor extends abstractexecutorservice
從上面的**可以得知,threadpoolexecutor繼承了abstractexecutorservice類,並提供了四個構造器,事實上,通過觀察每個構造器的原始碼具體實現,發現前面三個構造器都是呼叫的第四個構造器進行的初始化工作。下面解釋下一下構造器中各個引數的含義:

timeunit.days; //天

timeunit.hours; //小時

timeunit.minutes; //分鐘

timeunit.seconds; //秒

timeunit.milliseconds; //毫秒

timeunit.microseconds; //微妙

timeunit.nanoseconds; //納秒

arrayblockingqueue :乙個由陣列結構組成的先進先出有界阻塞佇列,此佇列建立時必須指定大小。

linkedblockingqueue :乙個由鍊錶結構組成的先進先出有界阻塞佇列,如果建立時沒有指定此佇列大小,則預設為integer.max_value。

priorityblockingqueue :乙個支援優先順序排序的無界阻塞佇列。

delayqueue: 乙個使用優先順序佇列實現的無界阻塞佇列。

synchronousqueue: 乙個不儲存元素的阻塞佇列,這個佇列比較特殊,它不會儲存提交的任務,而是將直接新建乙個執行緒來執行新來的任務。

linkedtransferqueue: 乙個由鍊錶結構組成的無界阻塞佇列。

linkedblockingdeque: 乙個由鍊錶結構組成的雙向阻塞佇列。

threadpoolexecutor.abortpolicy:丟棄任務並丟擲rejectedexecutionexception異常(預設)。 

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

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

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

可以自定義拒絕策略

public class myrejected implements rejectedexecutionhandler

}

從上面給出的threadpoolexecutor類的**可以知道,threadpoolexecutor繼承了abstractexecutorservice,我們來看一下abstractexecutorservice的實現:

abstractexecutorservice是乙個抽象類,它實現了executorservice介面。我們接著看executorservice介面的實現:

public inte***ce executor
executor是乙個頂層介面,在它裡面只宣告了乙個方法execute(runnable),返回值為void,引數為runnable型別,從字面意思可以理解,就是用來執行傳進去的任務的;executorservice介面繼承了executor介面,並宣告了一些方法:submit、invokeall、invokeany以及shutdown等;abstractexecutorservice實現了executorservice介面,基本實現了executorservice中宣告的所有方法;threadpoolexecutor繼承了類abstractexecutorservice。

在threadpoolexecutor類中有幾個非常重要的方法:

①execute()

execute()方法:實際上是executor中宣告的方法,在threadpoolexecutor進行了具體的實現,這個方法是threadpoolexecutor的核心方法,通過這個方法可以向執行緒池提交乙個任務,交由執行緒池去執行。

②submit()

③shutdown() :

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

④shutdownnow() :

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

還有很多其他的方法:

比如:getqueue() 、getpoolsize() 、getactivecount()、getcompletedtaskcount()等獲取與執行緒池相關屬性的方法

執行緒池框架executor

eexecutor作為靈活且強大的非同步執行框架,其支援多種不同型別的任務執行策略,提供了一種標準的方法將任務的提交過程和執行過程解耦開發,基於生產者 消費者模式,其提交任務的執行緒相當於生產者,執行任務的執行緒相當於消費者,並用runnable來表示任務,executor的實現還提供了對生命週期的...

JUC 執行緒池 Executor

建立執行緒池可以分為三種方式 1.通過threadpoolexecutor的構造方法,建立threadpoolexecutor的物件,即乙個執行緒池物件 此構造方法,一共7個引數,5個必須引數,2個帶有預設值的引數 詳細後面說 傳送 2.通過executors返回的執行緒池物件 這種方法建立的常用執...

JDK 執行緒池

在jdk的4種執行緒池之前,先介紹一下執行緒池的幾個引數 固定執行緒池數量,核心執行緒數 最大執行緒數 任務佇列 linkedblockingqueue integer.max value 無界佇列 適用於同時處理固定任務數的場景.public static executorservice newf...