成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java線程池——ThreadPoolExecutor源碼解析

TerryCai / 3449人閱讀

摘要:將線程池狀態(tài)置為并不會立即停止,停止接收外部的任務(wù),內(nèi)部正在跑的任務(wù)和隊列里等待的任務(wù),會執(zhí)行完,才真正停止。將線程池狀態(tài)置為。

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

1 ThreadPoolExecutor提供了四個構(gòu)造函數(shù):
//五個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,

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

//六個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,

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

//六個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,

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

//七個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,

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

2 各個參數(shù)解釋

int corePoolSize:該線程池中核心線程數(shù)最大值。

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

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

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

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

TimeUnit unit:keepAliveTime的單位

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

BlockingQueue workQueue:該線程池中的任務(wù)隊列:維護等待執(zhí)行的Runnable對象。

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

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

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

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

DelayQueue:隊列中元素必須實現(xiàn)Delayed接口,這就意味著你傳進去的任務(wù)必須實現(xiàn)

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

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

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

3 常用API解釋:

public void execute(Runnable command)

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

public void shutdown()

將線程池狀態(tài)置為SHUTDOWN,并不會立即停止,停止接收外部submit的任務(wù),內(nèi)部正在跑的任務(wù)和隊列里等待的任務(wù),會執(zhí)行完,才真正停止。

public List shutdownNow()

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

public boolean awaitTermination(long timeout, TimeUnit unit)

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71979.html

相關(guān)文章

  • 后端ing

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

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

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

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

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

    MockingBird 評論0 收藏0
  • Java線程

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

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

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

    wthee 評論0 收藏0

發(fā)表評論

0條評論

TerryCai

|高級講師

TA的文章

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