摘要:限制線程池運(yùn)行線程以及等待線程數(shù)量的策略對(duì)于所提供的,可以保證可以在內(nèi)存中有固定數(shù)量的線程數(shù)運(yùn)行。指的是當(dāng)線程池拒絕該任務(wù)的時(shí)候,線程在本地線程直接。由此限制了線程池的等待線程數(shù)與執(zhí)行線程數(shù)
限制Java線程池運(yùn)行線程以及等待線程數(shù)量的策略
對(duì)于java.util.concurrent.Executors所提供的FixedThreadPool,可以保證可以在內(nèi)存中有固定數(shù)量的線程數(shù)運(yùn)行。但是由于FixedThreadPool綁定的是LinkedBlockingQueue。隊(duì)列的上限沒(méi)有限制(默認(rèn)上限為Integer.MAX_VALUE),不斷的提交新的線程,會(huì)造成任務(wù)在內(nèi)存中長(zhǎng)時(shí)間的堆積。
我們有可能面臨如下的場(chǎng)景,主線程不斷地提交任務(wù)線程,希望有固定數(shù)量的在線程中運(yùn)行,也不想造成線程在內(nèi)存中大量的等待堆積。由此需要我們自己定義一個(gè)線程池策略。ThreadPoolExecutor為我們線程池的設(shè)置提供了很大的靈活性。
首先看FixedThreadPool的實(shí)現(xiàn):
public static ExecutorService More ...newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), threadFactory); }
可以看到,F(xiàn)ixedThreadPool綁定的是LinkedBlockingQueue
第二個(gè)是采用CallerRunsPolicy。ThreadPoolExecutor可以定義不同的任務(wù)拒絕策略。CallerRunsPolicy指的是當(dāng)線程池拒絕該任務(wù)的時(shí)候,線程在本地線程直接execute。這樣就限制了本地線程的循環(huán)提交流程。
BlockingQueueworkingQueue = new ArrayBlockingQueue (10); RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); ExecutorService threadPool = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, workingQueue, rejectedExecutionHandler); for (int i = 0; i < 100; i++) { threadPool.submit(new Callable () { @Override public Boolean call() throws Exception { System.out.println("thread " + String.valueOf(threadNo) + " is called"); Thread.sleep(10000); System.out.println("thread " + String.valueOf(threadNo) + " is awake"); throw new Exception(); } }); }
代碼中定義了大小為10的線程池,for循環(huán)提交了20個(gè)線程的時(shí)候,10個(gè)執(zhí)行線程,10個(gè)線程放入了workingQueue。當(dāng)提交到第21個(gè)線程的時(shí)候,會(huì)觸發(fā)RejectedExecutionHandler。在這里我們配置了CallerRunsPolicy策略。所以會(huì)在主線程直接執(zhí)行該線程。也就是說(shuō),在本程序中最多會(huì)有11個(gè)線程在執(zhí)行,10個(gè)線程在等待。由此限制了線程池的等待線程數(shù)與執(zhí)行線程數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64881.html
摘要:去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用以下做個(gè)總結(jié)。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用,以下做個(gè)總結(jié)。關(guān)于線程之前也寫(xiě)過(guò)一篇文章《高級(jí)面試題總結(jié)—線程池還能這么玩?》 1、什么是線程池:? java.util...
摘要:去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用以下做個(gè)總結(jié)。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用,以下做個(gè)總結(jié)。關(guān)于線程之前也寫(xiě)過(guò)一篇文章《高級(jí)面試題總結(jié)—線程池還能這么玩?》 1、什么是線程池:? java.util...
摘要:限期阻塞調(diào)用方法等待時(shí)間結(jié)束或線程執(zhí)行完畢。終止?fàn)顟B(tài)線程執(zhí)行完畢或出現(xiàn)異常退了。和都會(huì)檢查線程何時(shí)中斷,并且在發(fā)現(xiàn)中斷時(shí)提前放回。工廠方法將線程池的最大大小設(shè)置為,而將基本大小設(shè)置為,并將超時(shí)大小設(shè)置為分鐘。 wait()、notify()、notifyAll() Object是所有類(lèi)的基類(lèi),它有5個(gè)方法組成了等待、通知機(jī)制的核心:notify()、notifyAll()、wait()...
摘要:最近項(xiàng)目中越來(lái)越多需要異步調(diào)用的地方,系統(tǒng)中雖有線程池管理,但還有可優(yōu)化的空間,通過(guò)分享該文章,幫助大家了解線程池,同時(shí)學(xué)習(xí)使用線程池開(kāi)啟線程需要注意的地方。沒(méi)錯(cuò),上述方法創(chuàng)建的線程池就是。線程池就是程序中的裝修公司,代勞各種臟活累活。 最近項(xiàng)目中越來(lái)越多需要異步調(diào)用的地方,系統(tǒng)中雖有線程池管理,但還有可優(yōu)化的空間,通過(guò)分享該文章,幫助大家了解線程池,同時(shí)學(xué)習(xí)使用線程池開(kāi)啟線程需要注意...
摘要:中的線程池是運(yùn)用場(chǎng)景最多的并發(fā)框架。才是真正的線程池。存放任務(wù)的隊(duì)列存放需要被線程池執(zhí)行的線程隊(duì)列。所以線程池的所有任務(wù)完成后,它最終會(huì)收縮到的大小。飽和策略一般情況下,線程池采用的是,表示無(wú)法處理新任務(wù)時(shí)拋出異常。 Java線程池 1. 簡(jiǎn)介 系統(tǒng)啟動(dòng)一個(gè)新線程的成本是比較高的,因?yàn)樗婕芭c操作系統(tǒng)的交互,這個(gè)時(shí)候使用線程池可以提升性能,尤其是需要?jiǎng)?chuàng)建大量聲明周期很短暫的線程時(shí)。Ja...
閱讀 2200·2021-11-15 11:38
閱讀 1161·2021-09-06 15:02
閱讀 3401·2021-08-27 13:12
閱讀 1369·2019-08-30 14:20
閱讀 2404·2019-08-29 15:08
閱讀 649·2019-08-29 14:08
閱讀 1733·2019-08-29 13:43
閱讀 1469·2019-08-26 12:11