摘要:將線程池狀態(tài)置為并不會立即停止,停止接收外部的任務(wù),內(nèi)部正在跑的任務(wù)和隊(duì)列里等待的任務(wù),會執(zhí)行完,才真正停止。將線程池狀態(tài)置為。
在Java中,我們經(jīng)常使用的線程池就是ThreadPoolExecutor,此外還有定時的線程池ScheduledExecutorService(),但是需要注意的是Executors.newCachedThreadPool()的線程是沒有上屆的,在使用時,需要注意,因?yàn)闆]有辦法控制線程數(shù)量,可能會導(dǎo)致線程的溢出。
一個簡單的示例
1 ThreadPoolExecutor提供了四個構(gòu)造函數(shù):
//五個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue)
//六個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory)
//六個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, RejectedExecutionHandler handler)
//七個參數(shù)的構(gòu)造函數(shù)
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
2 各個參數(shù)解釋
int corePoolSize:該線程池中核心線程數(shù)最大值。
核心線程:線程池新建線程的時候,如果當(dāng)前線程總數(shù)小于corePoolSize,則新建的是核心線程,如果超過corePoolSize,則新建的線程即為非核心線程,核心線程默認(rèn)情況下會一直存在線程池中,即使這個線程什么也不干,如果指定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ù)隊(duì)列:維護(hù)等待執(zhí)行的Runnable對象。
如果當(dāng)所有的核心線程都在干活時,新添加的任務(wù)會被添加到這個隊(duì)列中等待處理,如果隊(duì)列滿了,則新建非核心的線程執(zhí)行任務(wù)。常用的workQueue類型。
SynchronousQueue:這個隊(duì)列接收到任務(wù)的時候,會直接提交給線程處理,而不會保留它,如果線程都在工作,那就新建一個線程來處理這個任務(wù),所以為了保證不出現(xiàn)<線程數(shù)達(dá)到了maximumPoolSize而不能新建線程>的錯誤,使用這個類型隊(duì)列的時候,maximumPoolSize一般指定成Integer.MAX_VALUE,即無限大。
LinkedBlockingQueue:這個隊(duì)列接收到任務(wù)的時候,如果線程小于核心線程,則新建核心線程來處理任務(wù),如果當(dāng)前線程等于核心線程數(shù),則進(jìn)入隊(duì)列中等待。由于這個隊(duì)列沒有最大值限制,即所有超過核心線程數(shù)的任務(wù)都會被添加到隊(duì)列中去,這也導(dǎo)致maximumPoolSize的設(shè)定失效,因?yàn)榭偩€程數(shù)永遠(yuǎn)不會超過corePoolSize
ArrayBlockingQueue:可以設(shè)定隊(duì)列的長度,接收到任務(wù)的時候,如果沒有達(dá)到corePoolSize的值,則新建線程執(zhí)行任務(wù),如果達(dá)到了,則入隊(duì)等候,如果隊(duì)列已滿,則新建線程執(zhí)行任務(wù),如果線程數(shù)到了maximumPoolSize,并且隊(duì)列中也滿了,則發(fā)生錯誤。
DelayQueue:隊(duì)列中元素必須實(shí)現(xiàn)Delayed接口,這就意味著你傳進(jìn)去的任務(wù)必須實(shí)現(xiàn)
Delayed接口,這個隊(duì)列接收到任務(wù)時,首先先入隊(duì),只有達(dá)到指定的延時時間,才會執(zhí)行任務(wù)。
ThreadFactory threadFactory:創(chuàng)建線程的方式,這是一個接口,你new它的時候需要實(shí)現(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í)行,或者因?yàn)樵搱?zhí)行器已經(jīng)關(guān)閉,或者因?yàn)槠淙萘恳呀?jīng)達(dá)到,則該任務(wù)由當(dāng)前{RejectedExecutionHandler}處理。
public void shutdown()
將線程池狀態(tài)置為SHUTDOWN,并不會立即停止,停止接收外部submit的任務(wù),內(nèi)部正在跑的任務(wù)和隊(duì)列里等待的任務(wù),會執(zhí)行完,才真正停止。
public List
將線程池狀態(tài)置為STOP。企圖立即停止,事實(shí)上不一定,跟shutdown()一樣,先停止接收外部提交的任務(wù),忽略隊(duì)列里等待的任務(wù),嘗試將正在跑的任務(wù)interrupt中斷,返回未執(zhí)行的任務(wù)列表。
public boolean awaitTermination(long timeout, TimeUnit unit)
當(dāng)前線程阻塞,直到等所有已提交的任務(wù)(包括正在跑的和隊(duì)列中等待的)執(zhí)行完,或者等超時時間到,或者線程被中斷,拋出InterruptedException,然后返回true(shutdown請求后所有任務(wù)執(zhí)行完畢)或false(已超時)。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/71979.html
摘要:當(dāng)活動線程核心線程非核心線程達(dá)到這個數(shù)值后,后續(xù)任務(wù)將會根據(jù)來進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:的前位數(shù)用來表示線程的數(shù)量,后面三位用來表示線程池的狀態(tài)。線程池的狀態(tài)有五種,分別是,根據(jù)單詞就能猜出大概。并且為了考慮性能問題,線程池的設(shè)計(jì)沒有使用悲觀鎖關(guān)鍵字,而是大量使用了和機(jī)制。 零 前期準(zhǔn)備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 2 ThreadPoolExecutor ...
摘要:那么線程池到底是怎么利用類來實(shí)現(xiàn)持續(xù)不斷地接收提交的任務(wù)并執(zhí)行的呢接下來,我們通過的源代碼來一步一步抽絲剝繭,揭開線程池運(yùn)行模型的神秘面紗。 在上一篇文章《從0到1玩轉(zhuǎn)線程池》中,我們了解了線程池的使用方法,以及向線程池中提交任務(wù)的完整流程和ThreadPoolExecutor.execute方法的源代碼。在這篇文章中,我們將會從頭閱讀線程池ThreadPoolExecutor類的源代...
摘要:線程池概述什么是線程池就是將多個線程放在一個池子里面所謂池化技術(shù)然后需要線程的時候不是創(chuàng)建一個線程而是從線程池里面獲取一個可用的線程然后執(zhí)行我們的任務(wù)線程池的優(yōu)勢降低資源消耗通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和消耗提供響應(yīng)速度當(dāng)任務(wù)到達(dá)時 線程池概述 什么是線程池 就是將多個線程放在一個池子里面(所謂池化技術(shù)),然后需要線程的時候不是創(chuàng)建一個線程,而是從線程池里面獲取一個可用的...
摘要:在前面介紹的文章中,提到了關(guān)于線程池的創(chuàng)建介紹,在文章之系列外部中第一部分有詳細(xì)的說明,請參閱文章中其實(shí)說明了外部的使用方式,但是沒有說內(nèi)部是如何實(shí)現(xiàn)的,為了加深對實(shí)現(xiàn)的理解,在使用中可以放心,我們這里將做源碼解析以及反饋到原理上,工具可 在前面介紹JUC的文章中,提到了關(guān)于線程池Execotors的創(chuàng)建介紹,在文章:《java之JUC系列-外部Tools》中第一部分有詳細(xì)的說明,請參...
閱讀 777·2023-04-25 15:49
閱讀 3205·2021-09-22 15:13
閱讀 1370·2021-09-07 10:13
閱讀 3536·2019-08-29 18:34
閱讀 2619·2019-08-29 15:22
閱讀 567·2019-08-27 10:52
閱讀 753·2019-08-26 18:27
閱讀 3104·2019-08-26 13:44