国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java線程池——ThreadPoolExecutor源碼解析

TerryCai / 3439人閱讀

摘要:將線程池狀態置為并不會立即停止,停止接收外部的任務,內部正在跑的任務和隊列里等待的任務,會執行完,才真正停止。將線程池狀態置為。

在Java中,我們經常使用的線程池就是ThreadPoolExecutor,此外還有定時的線程池ScheduledExecutorService(),但是需要注意的是Executors.newCachedThreadPool()的線程是沒有上屆的,在使用時,需要注意,因為沒有辦法控制線程數量,可能會導致線程的溢出。
一個簡單的示例

1 ThreadPoolExecutor提供了四個構造函數:
//五個參數的構造函數
public ThreadPoolExecutor(int corePoolSize,

                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue workQueue)

//六個參數的構造函數
public ThreadPoolExecutor(int corePoolSize,

                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue workQueue,
                      ThreadFactory threadFactory)

//六個參數的構造函數
public ThreadPoolExecutor(int corePoolSize,

                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue workQueue,
                      RejectedExecutionHandler handler)

//七個參數的構造函數
public ThreadPoolExecutor(int corePoolSize,

                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue workQueue,
                      ThreadFactory threadFactory,
                      RejectedExecutionHandler handler)

2 各個參數解釋

int corePoolSize:該線程池中核心線程數最大值。

核心線程:線程池新建線程的時候,如果當前線程總數小于corePoolSize,則新建的是核心線程,如果超過corePoolSize,則新建的線程即為非核心線程,核心線程默認情況下會一直存在線程池中,即使這個線程什么也不干,如果指定ThreadPoolExecutor的allowCoreThreadTimeOut這個屬性是true,那么核心線程如果長時間不干活的話,超過一定時間,就會被銷毀掉。

int maximumPoolSize:該線程池中線程的最大值

long keepAliveTime :該線程池中非核心線程閑置超時時間

一個非核心線程,如果不干活的時間超過這個參數所設定的時長,就會被銷毀,如果設置allowCoreThreadTimeOut = true,那么核心線程超過所設定的時長,那么也會銷毀掉。

TimeUnit unit:keepAliveTime的單位

TimeUnit是一個枚舉類型,其包括:NANOSECONDS : 1微毫秒 = 1微秒 / 1000,MICROSECONDS : 1微秒 = 1毫秒 / 1000,MILLISECONDS : 1毫秒 = 1秒 /1000,
SECONDS : 秒,MINUTES : 分,HOURS : 小時,DAYS : 天。

BlockingQueue workQueue:該線程池中的任務隊列:維護等待執行的Runnable對象。

如果當所有的核心線程都在干活時,新添加的任務會被添加到這個隊列中等待處理,如果隊列滿了,則新建非核心的線程執行任務。常用的workQueue類型。

SynchronousQueue:這個隊列接收到任務的時候,會直接提交給線程處理,而不會保留它,如果線程都在工作,那就新建一個線程來處理這個任務,所以為了保證不出現<線程數達到了maximumPoolSize而不能新建線程>的錯誤,使用這個類型隊列的時候,maximumPoolSize一般指定成Integer.MAX_VALUE,即無限大。

LinkedBlockingQueue:這個隊列接收到任務的時候,如果線程小于核心線程,則新建核心線程來處理任務,如果當前線程等于核心線程數,則進入隊列中等待。由于這個隊列沒有最大值限制,即所有超過核心線程數的任務都會被添加到隊列中去,這也導致maximumPoolSize的設定失效,因為總線程數永遠不會超過corePoolSize

ArrayBlockingQueue:可以設定隊列的長度,接收到任務的時候,如果沒有達到corePoolSize的值,則新建線程執行任務,如果達到了,則入隊等候,如果隊列已滿,則新建線程執行任務,如果線程數到了maximumPoolSize,并且隊列中也滿了,則發生錯誤。

DelayQueue:隊列中元素必須實現Delayed接口,這就意味著你傳進去的任務必須實現

Delayed接口,這個隊列接收到任務時,首先先入隊,只有達到指定的延時時間,才會執行任務。

ThreadFactory threadFactory:創建線程的方式,這是一個接口,你new它的時候需要實現它的Thread newThread(Runnable r)方法,一般用不上。

RejectedExecutionHandler handler:這玩意兒就是拋出異常專用的,比如上面提到的兩個錯誤發生了,就會由這個handler拋出異常,根本用不上。

3 常用API解釋:

public void execute(Runnable command)

將來某個時候執行給定的任務。任務可以在新線程中執行,也可以在現有的池線程中執行。如果無法提交任務以供執行,或者因為該執行器已經關閉,或者因為其容量已經達到,則該任務由當前{RejectedExecutionHandler}處理。

public void shutdown()

將線程池狀態置為SHUTDOWN,并不會立即停止,停止接收外部submit的任務,內部正在跑的任務和隊列里等待的任務,會執行完,才真正停止。

public List shutdownNow()

將線程池狀態置為STOP。企圖立即停止,事實上不一定,跟shutdown()一樣,先停止接收外部提交的任務,忽略隊列里等待的任務,嘗試將正在跑的任務interrupt中斷,返回未執行的任務列表。

public boolean awaitTermination(long timeout, TimeUnit unit)

當前線程阻塞,直到等所有已提交的任務(包括正在跑的和隊列中等待的)執行完,或者等超時時間到,或者線程被中斷,拋出InterruptedException,然后返回true(shutdown請求后所有任務執行完畢)或false(已超時)。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71979.html

相關文章

  • 后端ing

    摘要:當活動線程核心線程非核心線程達到這個數值后,后續任務將會根據來進行拒絕策略處理。線程池工作原則當線程池中線程數量小于則創建線程,并處理請求。當線程池中的數量等于最大線程數時默默丟棄不能執行的新加任務,不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評論0 收藏0
  • 追蹤解析 ThreadPoolExecutor 源碼

    摘要:的前位數用來表示線程的數量,后面三位用來表示線程池的狀態。線程池的狀態有五種,分別是,根據單詞就能猜出大概。并且為了考慮性能問題,線程池的設計沒有使用悲觀鎖關鍵字,而是大量使用了和機制。 零 前期準備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 2 ThreadPoolExecutor ...

    gaomysion 評論0 收藏0
  • 線程運行模型源碼解析

    摘要:那么線程池到底是怎么利用類來實現持續不斷地接收提交的任務并執行的呢接下來,我們通過的源代碼來一步一步抽絲剝繭,揭開線程池運行模型的神秘面紗。 在上一篇文章《從0到1玩轉線程池》中,我們了解了線程池的使用方法,以及向線程池中提交任務的完整流程和ThreadPoolExecutor.execute方法的源代碼。在這篇文章中,我們將會從頭閱讀線程池ThreadPoolExecutor類的源代...

    MockingBird 評論0 收藏0
  • Java線程

    摘要:線程池概述什么是線程池就是將多個線程放在一個池子里面所謂池化技術然后需要線程的時候不是創建一個線程而是從線程池里面獲取一個可用的線程然后執行我們的任務線程池的優勢降低資源消耗通過重復利用已創建的線程降低線程創建和消耗提供響應速度當任務到達時 線程池概述 什么是線程池 就是將多個線程放在一個池子里面(所謂池化技術),然后需要線程的時候不是創建一個線程,而是從線程池里面獲取一個可用的...

    darkerXi 評論0 收藏0
  • Java線程架構(一)原理和源碼解析

    摘要:在前面介紹的文章中,提到了關于線程池的創建介紹,在文章之系列外部中第一部分有詳細的說明,請參閱文章中其實說明了外部的使用方式,但是沒有說內部是如何實現的,為了加深對實現的理解,在使用中可以放心,我們這里將做源碼解析以及反饋到原理上,工具可 在前面介紹JUC的文章中,提到了關于線程池Execotors的創建介紹,在文章:《java之JUC系列-外部Tools》中第一部分有詳細的說明,請參...

    wthee 評論0 收藏0

發表評論

0條評論

TerryCai

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<