1. 程式人生 > 實用技巧 >關於多執行緒一些比較關鍵的類(ThreadLocal Lock ReentrantLock Thread ThreadPoolExecute ThreadPoolSchduleExecute Execute ReenTrantReadWriteLock 阻塞佇列)

關於多執行緒一些比較關鍵的類(ThreadLocal Lock ReentrantLock Thread ThreadPoolExecute ThreadPoolSchduleExecute Execute ReenTrantReadWriteLock 阻塞佇列)

Thread

基本介紹:

執行緒是程式中執行的執行緒。 Java虛擬機器允許應用程式同時執行多個執行執行緒。

基本方法:

構造方法:

Thread() 分配一個新的 Thread物件。
Thread(Runnabletarget) 分配一個新的 Thread物件。
Thread(Runnabletarget, Stringname) 分配一個新的 Thread物件。
Thread(Stringname) 分配一個新的 Thread物件。
Thread(ThreadGroupgroup, Runnabletarget) 分配一個新的 Thread物件。
Thread
(ThreadGroupgroup, Runnabletarget, Stringname)
分配一個新的 Thread物件,使其具有 target作為其執行物件,具有指定的 name作為其名稱,屬於 group引用的執行緒組。
Thread(ThreadGroupgroup, Runnabletarget, Stringname, longstackSize) 分配一個新的 Thread物件,以便它具有 target作為其執行物件,將指定的 name正如其名,以及屬於該執行緒組由稱作 group ,並具有指定的 堆疊大小
Thread(ThreadGroupgroup, String
name)
分配一個新的 Thread物件。

靜態方法:

static int MAX_PRIORITY 執行緒可以擁有的最大優先順序。
static int MIN_PRIORITY 執行緒可以擁有的最小優先順序。
static int NORM_PRIORITY 分配給執行緒的預設優先順序。
static class Thread.State 執行緒狀態。
static interface Thread.UncaughtExceptionHandler 當Thread由於未捕獲的異常而突然終止時,處理程式的 介面被呼叫。

例項方法:

static int
activeCount() 返回當前執行緒的thread group及其子組中活動執行緒數的估計。
void checkAccess() 確定當前正在執行的執行緒是否有許可權修改此執行緒。
protected Object clone() 將CloneNotSupportedException作為執行緒丟擲無法有意義地克隆。
int countStackFrames() 已棄用 此呼叫的定義取決於suspend() ,它已被棄用。 此外,此呼叫的結果從未明確。
static Thread currentThread() 返回對當前正在執行的執行緒物件的引用。
void destroy() 已棄用 這種方法最初是為了銷燬這個執行緒而沒有任何清理。 它所持有的任何監視器都將保持鎖定。 但是,該方法從未實現。 如果要實施,那麼它將是suspend()的方式是僵死的如果目標執行緒在銷燬時保護關鍵系統資源的鎖,則無法再次訪問該資源。 如果另一個執行緒曾嘗試鎖定此資源,將導致死鎖。 這種僵局通常表現為“凍結”過程。 有關詳細資訊,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?
static void dumpStack() 將當前執行緒的堆疊跟蹤列印到標準錯誤流。
static int enumerate(Thread[]tarray) 將當前執行緒的執行緒組及其子組中的每個活動執行緒複製到指定的陣列中。
static Map<Thread,StackTraceElement[]> getAllStackTraces() 返回所有活動執行緒的堆疊跟蹤圖。
ClassLoader getContextClassLoader() 返回此Thread的上下文ClassLoader。
static Thread.UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() 返回當執行緒由於未捕獲異常突然終止而呼叫的預設處理程式。
long getId() 返回此執行緒的識別符號。
String getName() 返回此執行緒的名稱。
int getPriority() 返回此執行緒的優先順序。
StackTraceElement[] getStackTrace() 返回表示此執行緒的堆疊轉儲的堆疊跟蹤元素陣列。
Thread.State getState() 返回此執行緒的狀態。
ThreadGroup getThreadGroup() 返回此執行緒所屬的執行緒組。
Thread.UncaughtExceptionHandler getUncaughtExceptionHandler() 返回由於未捕獲的異常,此執行緒突然終止時呼叫的處理程式。
static boolean holdsLock(Objectobj) 返回 true當且僅當當前執行緒在指定的物件上保持監視器鎖。
void interrupt() 中斷這個執行緒。
static boolean interrupted() 測試當前執行緒是否中斷。
boolean isAlive() 測試這個執行緒是否活著。
boolean isDaemon() 測試這個執行緒是否是守護執行緒。
boolean isInterrupted() 測試這個執行緒是否被中斷。
void join() 等待這個執行緒死亡。
void join(longmillis) 等待這個執行緒死亡最多 millis毫秒。
void join(longmillis, intnanos) 等待最多 millis毫秒加上 nanos納秒這個執行緒死亡。
void resume() 已棄用 該方法僅用於與suspend()一起使用,因為它是死鎖傾向的,因此已被棄用。 有關詳細資訊,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?
void run() 如果這個執行緒使用單獨的Runnable執行物件構造,則呼叫該Runnable物件的run方法; 否則,此方法不執行任何操作並返回。
void setContextClassLoader(ClassLoadercl) 設定此執行緒的上下文ClassLoader。
void setDaemon(booleanon) 將此執行緒標記為 daemon執行緒或使用者執行緒。
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandlereh) 設定當執行緒由於未捕獲的異常突然終止而呼叫的預設處理程式,並且沒有為該執行緒定義其他處理程式。
void setName(Stringname) 將此執行緒的名稱更改為等於引數 name
void setPriority(intnewPriority) 更改此執行緒的優先順序。
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandlereh) 設定當該執行緒由於未捕獲的異常而突然終止時呼叫的處理程式。
static void sleep(longmillis) 使當前正在執行的執行緒以指定的毫秒數暫停(暫時停止執行),具體取決於系統定時器和排程程式的精度和準確性。
static void sleep(longmillis, intnanos) 導致正在執行的執行緒以指定的毫秒數加上指定的納秒數來暫停(臨時停止執行),這取決於系統定時器和排程器的精度和準確性。
void start() 導致此執行緒開始執行; Java虛擬機器呼叫此執行緒的run方法。
void stop() 已棄用 這種方法本質上是不安全的。 使用Thread.stop停止執行緒可以解鎖所有已鎖定的監視器(由於未ThreadDeath ThreadDeath異常在堆疊中ThreadDeath的自然結果)。 如果先前受這些監視器保護的任何物件處於不一致的狀態,則損壞的物件將變得對其他執行緒可見,可能導致任意行為。 stop許多用途應該被替換為只是修改一些變數以指示目標執行緒應該停止執行的程式碼。 目標執行緒應該定期檢查此變數,如果變量表示要停止執行,則以有序方式從其執行方法返回。 如果目標執行緒長時間等待(例如,在interrupt變數上),則應該使用interrupt方法來中斷等待。 有關詳細資訊,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?
void stop(Throwableobj) 已棄用 該方法最初設計為強制執行緒停止並丟擲一個給定的Throwable作為例外。 它本質上是不安全的(有關詳細資訊,請參閱stop() ),此外還可用於生成目標執行緒未準備處理的異常。 有關詳細資訊,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?
void suspend() 已棄用 這種方法已被棄用,因為它本身就是死鎖的。 如果目標執行緒在掛起時保護關鍵系統資源的監視器上的鎖定,則在目標執行緒恢復之前,執行緒不能訪問該資源。 如果要恢復目標執行緒的執行緒在呼叫resume之前嘗試鎖定此監視器, resume導致死鎖。 這種僵局通常表現為“凍結”過程。 有關詳細資訊,請參閱Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?
String toString() 返回此執行緒的字串表示,包括執行緒的名稱,優先順序和執行緒組。
static void yield() 對排程程式的一個暗示,即當前執行緒願意產生當前使用的處理器。

ThreadLocal

基本介紹:

這個類提供執行緒區域性變數。 這些變數與其正常的對應方式不同,因為訪問一個的每個執行緒(通過其getset方法)都有自己獨立初始化的變數副本。 ThreadLocal例項通常是希望將狀態與執行緒關聯的類中的私有靜態欄位(例如,使用者ID或事務ID)。

基本方法

Modifier and TypeMethod and Description
T get() 返回當前執行緒的此執行緒區域性變數的副本中的值。
protected T initialValue() 返回此執行緒區域性變數的當前執行緒的“初始值”。
void remove() 刪除此執行緒區域性變數的當前執行緒的值。
void set(Tvalue) 將當前執行緒的此執行緒區域性變數的副本設定為指定的值。
static <S>ThreadLocal<S> withInitial(Supplier<? extends S>supplier) 建立執行緒區域性變數。

Interface Lock(顯式鎖)

基本介紹

Lock實現提供比使用synchronized方法和語句可以獲得的更廣泛的鎖定操作。 它們允許更靈活的結構化,可能具有完全不同的屬性,並且可以支援多個相關聯的物件Condition

鎖是用於通過多個執行緒控制對共享資源的訪問的工具。 通常,鎖提供對共享資源的獨佔訪問:一次只能有一個執行緒可以獲取鎖,並且對共享資源的所有訪問都要求首先獲取鎖。 但是,一些鎖可能允許併發訪問共享資源,如ReadWriteLock的讀鎖。

使用synchronized方法或語句提供對與每個物件相關聯的隱式監視器鎖的訪問,但是強制所有鎖獲取和釋放以塊結構的方式發生:當獲取多個鎖時,它們必須以相反的順序被釋放,並且所有的鎖都必須被釋放在與它們相同的詞彙範圍內。

雖然synchronized方法和語句的範圍機制使得使用監視器鎖更容易程式設計,並且有助於避免涉及鎖的許多常見程式設計錯誤,但是有時您需要以更靈活的方式處理鎖。 例如,用於遍歷併發訪問的資料結構的一些演算法需要使用“手動”或“鏈鎖定”:您獲取節點A的鎖定,然後獲取節點B,然後釋放A並獲取C,然後釋放B並獲得D等。 所述的實施方式中Lock介面通過允許獲得並在不同的範圍釋放的鎖,並允許獲得並以任何順序釋放多個鎖使得能夠使用這樣的技術。

隨著這種增加的靈活性,額外的責任。 沒有塊結構化鎖定會刪除使用synchronized方法和語句發生的鎖的自動釋放。 在大多數情況下,應使用以下慣用語:

   Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); } 
當在不同範圍內發生鎖定和解鎖時,必須注意確保在鎖定時執行的所有程式碼由try-finally或try-catch保護,以確保在必要時釋放鎖定。

Lock實現提供了使用synchronized方法和語句的附加功能,通過提供非阻塞嘗試來獲取鎖( tryLock() ),嘗試獲取可被中斷的鎖( lockInterruptibly() ,以及嘗試獲取可以超時( tryLock(long, TimeUnit) )。

一個Lock類還可以提供與隱式監視鎖定的行為和語義完全不同的行為和語義,例如保證排序,非重入使用或死鎖檢測。 如果一個實現提供了這樣的專門的語義,那麼實現必須記錄這些語義。

請注意, Lock例項只是普通物件,它們本身可以用作synchronized語句中的目標。 獲取Lock例項的監視器鎖與呼叫該例項的任何lock()方法沒有特定關係。 建議為避免混淆,您不要以這種方式使用Lock例項,除了在自己的實現中。

除非另有說明,傳遞任何引數的null值將導致NullPointerException被丟擲。

所有已知實現類:

ReentrantLockReentrantReadWriteLock.ReadLockReentrantReadWriteLock.WriteLock

基本方法:

void lock() 獲得鎖。
void lockInterruptibly() 獲取鎖定,除非當前執行緒是 interrupted
Condition newCondition() 返回一個新Condition繫結到該例項Lock例項。
boolean tryLock() 只有在呼叫時才可以獲得鎖。
boolean tryLock(longtime, TimeUnitunit) 如果在給定的等待時間內是空閒的,並且當前的執行緒尚未得到 interrupted,則獲取該鎖。
void unlock() 釋放鎖。

Class ReentrantLock

基本介紹

一個可重入互斥Lock具有與使用synchronized方法和語句訪問的隱式監視鎖相同的基本行為和語義,但具有擴充套件功能。

基本方法:

int getHoldCount() 查詢當前執行緒對此鎖的暫停數量。
protected Thread getOwner() 返回當前擁有此鎖的執行緒,如果不擁有,則返回 null
protected Collection<Thread> getQueuedThreads() 返回包含可能正在等待獲取此鎖的執行緒的集合。
int getQueueLength() 返回等待獲取此鎖的執行緒數的估計。
protected Collection<Thread> getWaitingThreads(Conditioncondition) 返回包含可能在與此鎖相關聯的給定條件下等待的執行緒的集合。
int getWaitQueueLength(Conditioncondition) 返回與此鎖相關聯的給定條件等待的執行緒數的估計。
boolean hasQueuedThread(Threadthread) 查詢給定執行緒是否等待獲取此鎖。
boolean hasQueuedThreads() 查詢是否有執行緒正在等待獲取此鎖。
boolean hasWaiters(Conditioncondition) 查詢任何執行緒是否等待與此鎖相關聯的給定條件。
boolean isFair() 如果此鎖的公平設定為true,則返回 true
boolean isHeldByCurrentThread() 查詢此鎖是否由當前執行緒持有。
boolean isLocked() 查詢此鎖是否由任何執行緒持有。
void lock() 獲得鎖。(類似synchronized關鍵字)
void lockInterruptibly() 獲取鎖定,除非當前執行緒是 interrupted
Condition newCondition() 返回Condition用於這種用途例項Lock例項。
String toString() 返回一個標識此鎖的字串以及其鎖定狀態。
boolean tryLock() 只有在呼叫時它不被另一個執行緒佔用才能獲取鎖。
boolean tryLock(longtimeout, TimeUnitunit) 如果在給定的等待時間內沒有被另一個執行緒 佔用 ,並且當前執行緒尚未被 保留,則獲取該鎖( interrupted)
void unlock() 嘗試釋放此鎖。 (一般在finally語句執行)

Interface Condition

基本介紹

Condition因素出Object監視器方法( waitnotifynotifyAll )成不同的物件,以得到具有多個等待集的每個物件,通過將它們與使用任意的組合的效果Lock實現。 Lock替換synchronized方法和語句的使用, Condition取代了物件監視器方法的使用。

條件(也稱為條件佇列條件變數 )為一個執行緒暫停執行(“等待”)提供了一種方法,直到另一個執行緒通知某些狀態現在可能為真。 因為訪問此共享狀態資訊發生在不同的執行緒中,所以它必須被保護,因此某種形式的鎖與該條件相關聯。 等待條件的關鍵屬性是它原子地釋放相關的鎖並掛起當前執行緒,就像Object.wait

一個Condition例項本質上繫結到一個鎖。 要獲得特定Condition例項的Condition例項,請使用其newCondition()方法。

基本方法:

void await() 導致當前執行緒等到發訊號或 interrupted
boolean await(longtime, TimeUnitunit) 使當前執行緒等待直到發出訊號或中斷,或指定的等待時間過去。
long awaitNanos(longnanosTimeout) 使當前執行緒等待直到發出訊號或中斷,或指定的等待時間過去。
void awaitUninterruptibly() 使當前執行緒等待直到發出訊號。
boolean awaitUntil(Datedeadline) 使當前執行緒等待直到發出訊號或中斷,或者指定的最後期限過去。
void signal() 喚醒一個等待執行緒。
void signalAll() 喚醒所有等待執行緒。

Interface ReadWriteLock(讀寫分離鎖的抽象)

基本介紹:

ReadWriteLock維護一對關聯的locks ,一個用於只讀操作,一個用於寫入。 read lock可以由多個閱讀器執行緒同時進行

基本方法:

Lock readLock() 返回用於閱讀的鎖。
Lock writeLock() 返回用於寫入的鎖。

Class ReentrantReadWriteLock(讀寫分離鎖)

基本介紹

  • 實現支援類似的語義到ReentrantLock
  • ReentrantReadWriteLock 讀寫鎖是一種改進的排他鎖,也可以稱作共享/排他鎖.
  • 允許多個執行緒同時讀取共享資料,但是一次只允許一個執行緒對共享資料進行更新.讀寫鎖通過讀鎖與寫鎖來完成讀寫操作.
  • 執行緒在讀取共享資料前必須先持有讀鎖,該讀鎖可以同時被多個執行緒持有,即它是共享的.
  • 執行緒在修改共享資料前必須先持有寫鎖,寫鎖是排他的, 一個執行緒持有寫鎖時其他執行緒無法獲得相應的鎖讀鎖只是在讀執行緒之間共享
  • 任何一個執行緒持有讀鎖時,其他執行緒都無法獲得寫鎖, 保證執行緒在讀取資料期間沒有其他執行緒對資料進行更新,使得讀執行緒能夠讀到資料的最新值,保證在讀資料期間共享變數不被修改

  讀寫互斥,讀讀共享,寫寫互斥

基本方法:

靜態方法:

static class ReentrantReadWriteLock.ReadLock 該鎖由方法 readLock()返回。
static class ReentrantReadWriteLock.WriteLock 該鎖由方法 writeLock()返回。

例項方法:

protected Thread getOwner() 返回當前擁有寫鎖的執行緒,如果不擁有,則返回 null
protected Collection<Thread> getQueuedReaderThreads() 返回一個包含可能正在等待獲取讀取鎖的執行緒的集合。
protected Collection<Thread> getQueuedThreads() 返回一個包含可能正在等待獲取讀取或寫入鎖定的執行緒的集合。
protected Collection<Thread> getQueuedWriterThreads() 返回一個包含可能正在等待獲取寫入鎖的執行緒的集合。
int getQueueLength() 返回等待獲取讀取或寫入鎖定的執行緒數的估計。
int getReadHoldCount() 查詢當前執行緒對此鎖的可重入讀取保留數。
int getReadLockCount() 查詢為此鎖持有的讀取鎖的數量。
protected Collection<Thread> getWaitingThreads(Conditioncondition) 返回包含可能在與寫鎖相關聯的給定條件下等待的執行緒的集合。
int getWaitQueueLength(Conditioncondition) 返回與寫入鎖相關聯的給定條件等待的執行緒數的估計。
int getWriteHoldCount() 查詢當前執行緒對此鎖的可重入寫入數量。
boolean hasQueuedThread(Threadthread) 查詢給定執行緒是否等待獲取讀取或寫入鎖定。
boolean hasQueuedThreads() 查詢是否有任何執行緒正在等待獲取讀取或寫入鎖定。
boolean hasWaiters(Conditioncondition) 查詢任何執行緒是否等待與寫鎖相關聯的給定條件。
boolean isFair() 如果此鎖的公平設定為true,則返回 true
boolean isWriteLocked() 查詢寫鎖是否由任何執行緒持有。
boolean isWriteLockedByCurrentThread() 查詢寫鎖是否由當前執行緒持有。
ReentrantReadWriteLock.ReadLock readLock() 返回用於閱讀的鎖。
String toString() 返回一個標識此鎖的字串以及其鎖定狀態。
ReentrantReadWriteLock.WriteLock writeLock() 返回用於寫入的鎖。

Interface Executor

基本介紹:

執行提交的物件Runnable任務。 該介面提供了一種將任務提交從每個任務的執行機制分解的方式,包括執行緒使用,排程等的Executor 。通常使用Executor而不是顯式建立執行緒。

基本方法:

void execute(Runnablecommand) 在將來的某個時間執行給定的命令。

Class ThreadPoolExecutor(普通任務)

基本介紹:

  • 一個ExecutorService ,使用可能的幾個合併的執行緒執行每個提交的任務,通常使用Executors工廠方法配置。
  • 執行緒池解決兩個不同的問題:由於每個任務的呼叫開銷減少,它們通常在執行大量非同步任務時提供改進的效能,並且它們提供了一種限制和管理資源(包括執行一個任務。 每個ThreadPoolExecutor還維護一些基本統計資訊,例如已完成任務的數量。

基本方法:

構造方法:

ThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue) 建立一個新的 ThreadPoolExecutor與給定的初始引數和預設執行緒工廠和拒絕執行處理程式。
ThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue, RejectedExecutionHandlerhandler) 建立一個新的 ThreadPoolExecutor與給定的初始引數和預設執行緒工廠。
ThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue, ThreadFactorythreadFactory) 建立一個新的 ThreadPoolExecutor與給定的初始引數和預設拒絕執行處理程式。
ThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue, ThreadFactorythreadFactory, RejectedExecutionHandlerhandler) 建立一個新 ThreadPoolExecutor給定的初始引數。

靜態方法:

static class ThreadPoolExecutor.AbortPolicy 被拒絕的任務的處理程式,丟擲一個 RejectedExecutionException
static class ThreadPoolExecutor.CallerRunsPolicy 一個被拒絕的任務的處理程式,直接在 execute方法的呼叫執行緒中執行被拒絕的任務,除非執行程式已經被關閉,否則這個任務被丟棄。
static class ThreadPoolExecutor.DiscardOldestPolicy 被拒絕的任務的處理程式,丟棄最舊的未處理請求,然後重試 execute ,除非執行程式關閉,在這種情況下,任務被丟棄。
static class ThreadPoolExecutor.DiscardPolicy 被拒絕的任務的處理程式靜默地丟棄被拒絕的任務。

例項方法:

protected void afterExecute(Runnabler, Throwablet) 完成指定Runnable的執行後呼叫方法。
void allowCoreThreadTimeOut(booleanvalue) 設定策略是否核心執行緒可能會超時,如果任務沒有在活著的時間內到達,則在新任務到達時被替換。
boolean allowsCoreThreadTimeOut() 如果此池允許核心執行緒超時並終止,如果沒有任務在keepAlive時間內到達,則返回true,如果新任務到達時需要更換。
boolean awaitTermination(longtimeout, TimeUnitunit) 阻止所有任務在關閉請求完成後執行,或發生超時,或當前執行緒中斷,以先到者為準。
protected void beforeExecute(Threadt, Runnabler) 在給定的執行緒中執行給定的Runnable之前呼叫方法。
void execute(Runnablecommand) 在將來某個時候執行給定的任務。
protected void finalize() 當這個執行器不再被引用並且沒有執行緒時,呼叫 shutdown
int getActiveCount() 返回正在執行任務的執行緒的大概數量。
long getCompletedTaskCount() 返回完成執行的任務的大致總數。
int getCorePoolSize() 返回核心執行緒數。
long getKeepAliveTime(TimeUnitunit) 返回執行緒保持活動時間,這是超過核心池大小的執行緒在終止之前可能保持空閒的時間量。
int getLargestPoolSize() 返回在池中同時進行的最大執行緒數。
int getMaximumPoolSize() 返回允許的最大執行緒數。
int getPoolSize() 返回池中當前的執行緒數。
BlockingQueue<Runnable> getQueue() 返回此執行程式使用的任務佇列。
RejectedExecutionHandler getRejectedExecutionHandler() 返回不可執行任務的當前處理程式。
long getTaskCount() 返回計劃執行的任務的大概總數。
ThreadFactory getThreadFactory() 返回用於建立新執行緒的執行緒工廠。
boolean isShutdown() 如果此執行者已關閉,則返回 true
boolean isTerminated() 如果所有任務在關閉後完成,則返回 true
boolean isTerminating() 如果此執行者在 shutdown()shutdownNow()之後 終止 ,但尚未完全終止,則返回true。
int prestartAllCoreThreads() 啟動所有核心執行緒,導致他們等待工作。
boolean prestartCoreThread() 啟動核心執行緒,使其無法等待工作。
void purge() 嘗試從工作佇列中刪除已取消的所有Future任務。
boolean remove(Runnabletask) 如果此任務存在,則從執行程式的內部佇列中刪除此任務,從而導致該任務尚未執行。
void setCorePoolSize(intcorePoolSize) 設定核心執行緒數。
void setKeepAliveTime(longtime, TimeUnitunit) 設定執行緒在終止之前可能保持空閒的時間限制。
void setMaximumPoolSize(intmaximumPoolSize) 設定允許的最大執行緒數。
void setRejectedExecutionHandler(RejectedExecutionHandlerhandler) 為不可執行的任務設定一個新的處理程式。
void setThreadFactory(ThreadFactorythreadFactory) 設定用於建立新執行緒的執行緒工廠。
void shutdown() 啟動有序關閉,其中先前提交的任務將被執行,但不會接受任何新任務。
List<Runnable> shutdownNow() 嘗試停止所有主動執行的任務,停止等待任務的處理,並返回正在等待執行的任務列表。
protected void terminated() 執行程式已終止時呼叫方法。
String toString() 返回標識此池的字串及其狀態,包括執行狀態和估計的工作人員和任務計數的指示。

Class ScheduledThreadPoolExecutor(專門做定時任務)

基本介紹:

ThreadPoolExecutor可另外排程在給定延遲之後執行的命令,或定期執行。 該類優選的是Timer需要多個工作執行緒時,或當附加靈活性或能力ThreadPoolExecutor需要(這此類擴充套件)。

延遲任務執行時間早於啟用,但沒有任何實時保證,在啟用後,他們將開始。 計劃執行完全相同執行時間的任務將以先進先出(FIFO)的提交順序啟用。

提交的任務在執行之前被取消,執行被抑制。 預設情況下,這樣一個取消的任務在工作佇列中不會自動刪除,直到其延遲過去。 雖然這樣可以進一步檢查和監控,但也可能導致取消任務的無限制保留。 為避免這種情況,請將setRemoveOnCancelPolicy(boolean)設定為true ,這將導致任務在取消時立即從工作佇列中刪除。

通過scheduleAtFixedRatescheduleWithFixedDelay的任務的scheduleWithFixedDelay執行不重疊。 雖然不同的執行可以通過不同的執行緒來執行,先前執行的效果happen-before那些隨後的那些的。

雖然這個類繼承自ThreadPoolExecutor ,但是一些繼承的調優方法對它沒有用。 特別是因為它作為使用corePoolSize執行緒和無限佇列的固定大小的池,對maximumPoolSize沒有任何有用的效果。 此外,將corePoolSize設定為零或使用allowCoreThreadTimeOut幾乎不是一個好主意,因為這可能會使池沒有執行緒來處理任務,只要它們有資格執行。

此類覆蓋executesubmit方法以生成內部ScheduledFuture物件來控制每個任務的延遲和排程。 為了保護功能,子類中這些方法的任何進一步覆蓋都必須呼叫超類版本,這有效地禁用其他任務自定義。 然而,此類提供替代保護擴充套件方法decorateTask (每一個用於一個版本RunnableCallable ),其可以被用於定製用於執行經由輸入的命令的具體任務型別executesubmitschedulescheduleAtFixedRatescheduleWithFixedDelay 預設情況下, ScheduledThreadPoolExecutor使用擴充套件為FutureTask的任務型別。 但是,可以使用以下形式的子類修改或替換:

基本方法:

構造方法:

ScheduledThreadPoolExecutor(intcorePoolSize) 建立一個新的 ScheduledThreadPoolExecutor與給定的核心池大小。
ScheduledThreadPoolExecutor(intcorePoolSize, RejectedExecutionHandlerhandler) 使用給定的初始引數建立一個新的ScheduledThreadPoolExecutor。
ScheduledThreadPoolExecutor(intcorePoolSize, ThreadFactorythreadFactory) 建立一個新的 ScheduledThreadPoolExecutor與給定的初始引數。
ScheduledThreadPoolExecutor(intcorePoolSize, ThreadFactorythreadFactory, RejectedExecutionHandlerhandler) 使用給定的初始引數建立一個新的ScheduledThreadPoolExecutor。

例項方法:

protected <V>RunnableScheduledFuture<V> decorateTask(Callable<V>callable, RunnableScheduledFuture<V>task) 修改或替換用於執行可呼叫的任務。
protected <V>RunnableScheduledFuture<V> decorateTask(Runnablerunnable, RunnableScheduledFuture<V>task) 修改或替換用於執行runnable的任務。
void execute(Runnablecommand) 執行 command零要求延遲。
boolean getContinueExistingPeriodicTasksAfterShutdownPolicy() 獲得關於是否繼續執行現有定期任務的策略,即使該執行者已經是 shutdown
boolean getExecuteExistingDelayedTasksAfterShutdownPolicy() 獲得有關是否執行現有延遲任務的政策,即使這個執行者已經是 shutdown
BlockingQueue<Runnable> getQueue() 返回此執行程式使用的任務佇列。
boolean getRemoveOnCancelPolicy() 獲取關於在取消時是否應立即將已取消任務從工作佇列中刪除的策略。
<V>ScheduledFuture<V> schedule(Callable<V>callable, longdelay, TimeUnitunit) 建立並執行在給定延遲後啟用的ScheduledFuture。
ScheduledFuture<?> schedule(Runnablecommand, longdelay, TimeUnitunit) 建立並執行在給定延遲後啟用的單次操作。
ScheduledFuture<?> scheduleAtFixedRate(Runnablecommand, longinitialDelay, longperiod, TimeUnitunit) 建立並執行在給定的初始延遲之後,隨後以給定的時間段首先啟用的週期性動作; 那就是執行將在initialDelay之後開始,然後initialDelay+period ,然後是initialDelay + 2 * period等等。
ScheduledFuture<?> scheduleWithFixedDelay(Runnablecommand, longinitialDelay, longdelay, TimeUnitunit) 建立並執行在給定的初始延遲之後首先啟用的定期動作,隨後在一個執行的終止和下一個執行的開始之間給定的延遲。
void setContinueExistingPeriodicTasksAfterShutdownPolicy(booleanvalue) 設定關於是否繼續執行現有周期性任務的策略,即使該執行者已經是 shutdown
void setExecuteExistingDelayedTasksAfterShutdownPolicy(booleanvalue) 設定關於是否執行現有延遲任務的策略,即使該執行者已經是 shutdown
void setRemoveOnCancelPolicy(booleanvalue) 設定取消時取消任務是否應立即從工作佇列中刪除的策略。
void shutdown() 啟動有序關閉,其中先前提交的任務將被執行,但不會接受任何新任務。
List<Runnable> shutdownNow() 嘗試停止所有主動執行的任務,停止等待任務的處理,並返回正在等待執行的任務列表。
<T>Future<T> submit(Callable<T>task) 提交值返回任務以執行,並返回代表任務待處理結果的Future。
Future<?> submit(Runnabletask) 提交一個可執行的任務執行,並返回一個表示該任務的未來。
<T>Future<T> submit(Runnabletask, Tresult) 提交一個可執行的任務執行,並返回一個表示該任務的未來。

阻塞佇列

JDK7 提供了 7 個阻塞佇列。分別是

  • ArrayBlockingQueue :一個由陣列結構組成的有界阻塞佇列。
  • LinkedBlockingQueue :一個由連結串列結構組成的有界阻塞佇列。
  • PriorityBlockingQueue :一個支援優先順序排序的無界阻塞佇列。
  • DelayQueue:一個使用優先順序佇列實現的無界阻塞佇列。
  • SynchronousQueue:一個不儲存元素的阻塞佇列。
  • LinkedTransferQueue:一個由連結串列結構組成的無界阻塞佇列。
  • LinkedBlockingDeque:一個由連結串列結構組成的雙向阻塞佇列

具體方法參照Collection介面的各個實現類

Interface Callable<V>

基本介紹:

返回結果並可能引發異常的任務。 實現者定義一個沒有引數的單一方法,稱為call

Callable介面類似於Runnable ,因為它們都是為其例項可能由另一個執行緒執行的類設計的。 然而,A Runnable不返回結果,也不能丟擲被檢查的異常。

基本方法:

V call() 計算一個結果,如果不能這樣做,就會丟擲一個異常。

FutureTask包裝器可以將Callable轉換成Future和Runable(Future同時實現了兩者的介面)

Interface Future<V> 

基本介紹:

Future計算的結果。 提供方法來檢查計算是否完成,等待其完成,並檢索計算結果。 結果只能在計算完成後使用方法get進行檢索,如有必要,阻塞,直到準備就緒。 取消由cancel方法執行。 提供其他方法來確定任務是否正常完成或被取消。 計算完成後,不能取消計算。 如果您想使用Future ,以便不可撤銷,但不提供可用的結果,則可以宣告Future<?>表格的型別,並返回null作為基礎任務的結果。

基本方法:

boolean cancel(booleanmayInterruptIfRunning) 嘗試取消執行此任務。
V get() 等待計算完成,然後檢索其結果。
V get(longtimeout, TimeUnitunit) 如果需要等待最多在給定的時間計算完成,然後檢索其結果(如果可用)。
boolean isCancelled() 如果此任務在正常完成之前被取消,則返回 true
boolean isDone() 返回 true如果任務已完成。