摘要:它是一種線程數(shù)量固定的線程池,當(dāng)線程處于空閑狀態(tài)時(shí),他們并不會(huì)被回收,除非線程池被關(guān)閉。這類線程池內(nèi)部只有一個(gè)核心線程,它確保所有的任務(wù)都在同一個(gè)線程中按順序執(zhí)行。
FixedThreadPool
由Executors的newFixedThreadPool方法創(chuàng)建。它是一種線程數(shù)量固定的線程池,當(dāng)線程處于空閑狀態(tài)時(shí),他們并不會(huì)被回收,除非線程池被關(guān)閉。當(dāng)所有的線程都處于活動(dòng)狀態(tài)時(shí),新的任務(wù)都會(huì)處于等待狀態(tài),直到有線程空閑出來(lái)。FixedThreadPool只有核心線程,且該核心線程都不會(huì)被回收,這意味著它可以更快地響應(yīng)外界的請(qǐng)求。
FixedThreadPool沒(méi)有額外線程,只存在核心線程,而且核心線程沒(méi)有超時(shí)機(jī)制,而且任務(wù)隊(duì)列沒(méi)有長(zhǎng)度的限制。
public class ThreadPoolExecutorTest { public static void main(String[] args) { ExecutorService fixedThreadPool =Executors. newFixedThreadPool(3); for (int i =1; i<=5;i++){ final int index=i ; fixedThreadPool.execute(new Runnable(){ @Override public void run() { try { System.out.println("第" +index + "個(gè)線程" +Thread.currentThread().getName()); Thread.sleep(1000); } catch(InterruptedException e ) { e .printStackTrace(); } } }); } } }CachedThreadPool
由Executors的newCachedThreadPool方法創(chuàng)建,不存在核心線程,只存在數(shù)量不定的非核心線程,而且其數(shù)量最大值為Integer.MAX_VALUE。當(dāng)線程池中的線程都處于活動(dòng)時(shí)(全滿),線程池會(huì)創(chuàng)建新的線程來(lái)處理新的任務(wù),否則就會(huì)利用新的線程來(lái)處理新的任務(wù),線程池中的空閑線程都有超時(shí)機(jī)制,默認(rèn)超時(shí)時(shí)長(zhǎng)為60s,超過(guò)60s的空閑線程就會(huì)被回收。和FixedThreadPool不同的是,CachedThreadPool的任務(wù)隊(duì)列其實(shí)相當(dāng)于一個(gè)空的集合,這將導(dǎo)致任何任務(wù)都會(huì)被執(zhí)行,因?yàn)樵谶@種場(chǎng)景下SynchronousQueue是不能插入任務(wù)的,SynchronousQueue是一個(gè)特殊的隊(duì)列,在很多情況下可以理解為一個(gè)無(wú)法儲(chǔ)存元素的隊(duì)列。從CachedThreadPool的特性看,這類線程比較適合執(zhí)行大量耗時(shí)較小的任務(wù)。當(dāng)整個(gè)線程池都處于閑置狀態(tài)時(shí),線程池中的線程都會(huì)因?yàn)槌瑫r(shí)而被停止回收,幾乎是不占任何系統(tǒng)資源。
ScheduledThreadPool通過(guò)Executors的newScheduledThreadPool方式創(chuàng)建,核心線程數(shù)量是固定的,而非核心線程是沒(méi)有限制的,并且當(dāng)非核心線程閑置時(shí)它會(huì)被立即回收,ScheduledThreadPool這類線程池主要用于執(zhí)行定時(shí)任務(wù)和具有固定時(shí)期的重復(fù)任務(wù)。
延遲:
public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(newRunnable(){ @Override public void run() { System.out.println("延遲三秒"); } }, 3, TimeUnit.SECONDS); } }
定時(shí):
public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.scheduleAtFixedRate(newRunnable(){ @Override public void run() { System.out.println("延遲1秒后每三秒執(zhí)行一次"); } },1,3,TimeUnit.SECONDS); } }SingleThreadExecutor
通過(guò)Executors的newSingleThreadExecutor方法來(lái)創(chuàng)建。這類線程池內(nèi)部只有一個(gè)核心線程,它確保所有的任務(wù)都在同一個(gè)線程中按順序執(zhí)行。SingleThreadExecutor的意義在于統(tǒng)一所有外界任務(wù)一個(gè)線程中,這使得這些任務(wù)之間不需要處理線程同步的問(wèn)題
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67604.html
摘要:四種線程池的使用介紹的弊端及四種線程池的使用,線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。相比,提供的四種線程池的好處在于重用存在的線程,減少對(duì)象創(chuàng)建消亡的開(kāi)銷,性能佳。延遲執(zhí)行描述創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。 java 四種線程池的使用 介紹new Thread的弊端及Java四種線程池的使用 1,線程池的作用 線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。 ...
摘要:此外,有兩個(gè)常用的關(guān)閉線程池的方法第一個(gè)方法將啟動(dòng)一次順序關(guān)閉,有任務(wù)在執(zhí)行,則等待執(zhí)行完成,但不接受新的任務(wù)第二個(gè)方法將取消所有未開(kāi)始的任務(wù)并且試圖中斷正在執(zhí)行的任務(wù),返回從未開(kāi)始執(zhí)行的任務(wù)的列表。 四種線程池 在Executors中提供了四種線程池: newCachedThreadPool 可緩存線程池,對(duì)于每個(gè)線程,如果有空閑線程可用,立即讓它執(zhí)行,如果沒(méi)有,則創(chuàng)建一個(gè)新線...
摘要:當(dāng)活動(dòng)線程核心線程非核心線程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線程池工作原則當(dāng)線程池中線程數(shù)量小于則創(chuàng)建線程,并處理請(qǐng)求。當(dāng)線程池中的數(shù)量等于最大線程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...
摘要:最后,我們會(huì)通過(guò)對(duì)源代碼的剖析深入了解線程池的運(yùn)行過(guò)程和具體設(shè)計(jì),真正達(dá)到知其然而知其所以然的水平。創(chuàng)建線程池既然線程池是一個(gè)類,那么最直接的使用方法一定是一個(gè)類的對(duì)象,例如。單線程線程池單線程線程 我們一般不會(huì)選擇直接使用線程類Thread進(jìn)行多線程編程,而是使用更方便的線程池來(lái)進(jìn)行任務(wù)的調(diào)度和管理。線程池就像共享單車,我們只要在我們有需要的時(shí)候去獲取就可以了。甚至可以說(shuō)線程池更棒,...
摘要:創(chuàng)建方法最大線程數(shù)即源碼單線程化的線程池有且僅有一個(gè)工作線程執(zhí)行任務(wù)所有任務(wù)按照指定順序執(zhí)行,即遵循隊(duì)列的入隊(duì)出隊(duì)規(guī)則創(chuàng)建方法源碼還有一個(gè)結(jié)合了和,就不介紹了,基本不用。 *本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布 為什么用線程池 創(chuàng)建/銷毀線程伴隨著系統(tǒng)開(kāi)銷,過(guò)于頻繁的創(chuàng)建/銷毀線程,會(huì)很大程度上影響處理效率 >例如: > >記創(chuàng)建線程消耗時(shí)間T1,執(zhí)行...
閱讀 1669·2021-09-28 09:35
閱讀 1139·2019-08-30 15:54
閱讀 1666·2019-08-30 15:44
閱讀 3370·2019-08-30 14:09
閱讀 499·2019-08-29 14:05
閱讀 2668·2019-08-28 17:53
閱讀 1992·2019-08-26 13:41
閱讀 1721·2019-08-26 13:26