減少了線程創(chuàng)建和銷毀的開銷,當執(zhí)行大量異步任務(wù)時線程池能提供較好的性能。
創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、保亭黎族網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、購物商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為保亭黎族等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。提供了一種資源限制和管理手段,比如可以限制線程的個數(shù),動態(tài)新增線程等。
Executor是一個接口,它是Executor框架的基礎(chǔ),它將任務(wù)的提交與任務(wù)的執(zhí)行分離開來。
ExecutorService接口繼承了Executor,在其上做了一些shutdown()、submit()的擴展,可以說是真正的線程池接口;
AbstractExecutorService抽象類實現(xiàn)了ExecutorService接口中的大部分方法;
ThreadPoolExecutor是線程池的核心實現(xiàn)類,用來執(zhí)行被提交的任務(wù)。
ScheduledExecutorService接口繼承了ExecutorService接口,提供了帶"周期執(zhí)行"功能ExecutorService;
ScheduledThreadPoolExecutor是一個實現(xiàn)類,可以在給定的延遲后運行命令,或者定期執(zhí)行命令。ScheduledThreadPoolExecutor比Timer更靈活,功能更強大。
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueworkQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
corePoolSize線程池中的核心線程數(shù),當提交一個任務(wù)時,線程池創(chuàng)建一個新線程執(zhí)行任務(wù),直到當前線程數(shù)等于corePoolSize;
如果當前線程數(shù)為corePoolSize,繼續(xù)提交的任務(wù)被保存到阻塞隊列中,等待被執(zhí)行;
如果執(zhí)行了線程池的prestartAllCoreThreads()方法,線程池會提前創(chuàng)建并啟動所有核心線程。
線程池中允許的大線程數(shù)。如果當前阻塞隊列滿了,且繼續(xù)提交任務(wù),則創(chuàng)建新的線程執(zhí)行任務(wù),前提是當前線程數(shù)小于maximumPoolSize
keepAliveTime線程空閑時的存活時間,即當線程沒有任務(wù)執(zhí)行時,繼續(xù)存活的時間。默認情況下,該參數(shù)只在線程數(shù)大于corePoolSize時才有用
TimeUnitkeepAliveTime的時間單位
workQueueworkQueue必須是BlockingQueue阻塞隊列。當線程池中的線程數(shù)超過它的corePoolSize的時候,線程會進入阻塞隊列進行阻塞等待。通過workQueue,線程池實現(xiàn)了阻塞功能。
用于保存等待執(zhí)行的任務(wù)的阻塞隊列,一般來說,我們應(yīng)該盡量使用有界隊列,因為使用無界隊列作為工作隊列會對線程池帶來如下影響。
1)當線程池中的線程數(shù)達到corePoolSize后,新任務(wù)將在無界隊列中等待,因此線程池中的線程數(shù)不會超過corePoolSize。
2)由于1,使用無界隊列時maximumPoolSize將是一個無效參數(shù)。
3)由于1和2,使用無界隊列時keepAliveTime將是一個無效參數(shù)。
4)更重要的,使用無界queue可能會耗盡系統(tǒng)資源,有界隊列則有助于防止資源耗盡,同時即使使用有界隊列,也要盡量控制隊列的大小在一個合適的范圍。
所以我們一般會使用,ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue。
創(chuàng)建線程的工廠,通過自定義的線程工廠可以給每個新建的線程設(shè)置一個具有識別度的線程名,當然還可以更加自由的對線程做更多的設(shè)置,比如設(shè)置所有的線程為守護線程。
參見代碼cn.enjoyedu.ch6. ThreadPoolAdvExecutors靜態(tài)工廠里默認的threadFactory,線程的命名規(guī)則是“pool-數(shù)字-thread-數(shù)字”。
線程池的飽和策略,當阻塞隊列滿了,且線程數(shù)達到maximumPoolSize限制,如果繼續(xù)提交任務(wù),必須采取一種策略處理該任務(wù),線程池提供了4種策略:
(1)AbortPolicy:直接拋出異常,默認策略;
(2)CallerRunsPolicy:用調(diào)用者所在的線程來執(zhí)行任務(wù);
(3)DiscardOldestPolicy:丟棄阻塞隊列中靠最前的任務(wù),并將該任務(wù)添加至隊列中;
(4)DiscardPolicy:直接丟棄任務(wù);
當然也可以根據(jù)應(yīng)用場景實現(xiàn)RejectedExecutionHandler接口,自定義飽和策略,如記錄日志或持久化存儲不能處理的任務(wù)。
線程池中 beforeExecute和 afterExecute方法。相當于執(zhí)行了一個切面。而在調(diào)用 shutdown 方法后則會調(diào)用 terminated 方法
提交任務(wù)execute()方法用于提交不需要返回值的任務(wù),所以無法判斷任務(wù)是否被線程池執(zhí)行成功。
submit()方法用于提交需要返回值的任務(wù)。線程池會返回一個future類型的對象,通過這個future對象可以判斷任務(wù)是否執(zhí)行成功,并且可以通過future的get()方法來獲取返回值,get()方法會阻塞當前線程直到任務(wù)完成,而使用get(long timeout,TimeUnit unit)方法則會阻塞當前線程一段時間后立即返回,這時候有可能任務(wù)沒有執(zhí)行完
獲取cpu核數(shù) Runtime.getRuntime().availableProcessors();
CPU密集型任務(wù)(數(shù)據(jù)計算):Ncup+1
IO密集型任務(wù)(讀取磁盤文件,讀取數(shù)據(jù)庫):2*Ncup
混合型任務(wù):兩者耗時相差兩到三倍則拆分成兩個線程池,偏差大的話就按大的處理
在指定一定延遲時間后或者定時進行調(diào)度執(zhí)行的線程池
定時線程池中要進行捕捉異常,若不捕捉,程序會拋出異常不再執(zhí)行并且程序無信息打印
ScheduledThreadPoolExecutor適用于需要多個后臺線程執(zhí)行周期任務(wù),同時為了滿足資源管理的需求而需要限制后臺線程的數(shù)量的應(yīng)用場景。
線程池隊列使用DelayedWorkQueue; ScheduledFutureTask是具有返回值的任務(wù),繼承自FutureTask。FutureTask的內(nèi)部有
一個變量state用來表示任務(wù)的狀態(tài)。
ScheduledFutureTask內(nèi)部還有一個變量period用來表示任務(wù)的類型,任務(wù)類型如下:
該方法的作用是提交一個延遲執(zhí)行的任務(wù),任務(wù)從提交時間算起延遲單位為unit的delay時間后開始執(zhí)行。提交的任務(wù)不是周期性任務(wù),任務(wù)只會執(zhí)行一次。
scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit)該方法的作用是,當任務(wù)執(zhí)行完畢后,讓其延遲固定時間后再次運行(fxed-delay任務(wù))。其中initialDelay表示提交任務(wù)后延遲多少時間開始執(zhí)行任務(wù)command,delay表示當任務(wù)執(zhí)行完畢后延長多少時間后再次運行command任務(wù),unit是initialDelay和delay的時間單位。任務(wù)會一直重復(fù)運行直到任務(wù)運行中拋出了異常,被取消了,或者關(guān)閉了線程池。
scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)該方法相對起始時間點以固定頻率調(diào)用指定的任務(wù)(fxed-rate任務(wù))。當把任務(wù)提交到線程池并延遲initialDelay時間(時間單位為unit)后開始執(zhí)行任務(wù)command。然后從initialDelay+period時間點再次執(zhí)行,而后在initialDelay+2*period時間點再次執(zhí)行,循環(huán)往復(fù),直到拋出異?;蛘哒{(diào)用了任務(wù)的cancel方法取消了任務(wù),或者關(guān)閉了線程池。scheduleAtFixedRate的原理與schedule WithFixedDelay類似,下面我們講下它們之間的不同點。首先調(diào)用scheduleAtFixedRate的代碼如下。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站標題:JUC之線程池-創(chuàng)新互聯(lián)
文章路徑:http://jinyejixie.com/article0/ccshoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計、服務(wù)器托管、建站公司、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容