摘要:限制線程池運行線程以及等待線程數(shù)量的策略對于所提供的,可以保證可以在內存中有固定數(shù)量的線程數(shù)運行。指的是當線程池拒絕該任務的時候,線程在本地線程直接。由此限制了線程池的等待線程數(shù)與執(zhí)行線程數(shù)
限制Java線程池運行線程以及等待線程數(shù)量的策略
對于java.util.concurrent.Executors所提供的FixedThreadPool,可以保證可以在內存中有固定數(shù)量的線程數(shù)運行。但是由于FixedThreadPool綁定的是LinkedBlockingQueue。隊列的上限沒有限制(默認上限為Integer.MAX_VALUE),不斷的提交新的線程,會造成任務在內存中長時間的堆積。
我們有可能面臨如下的場景,主線程不斷地提交任務線程,希望有固定數(shù)量的在線程中運行,也不想造成線程在內存中大量的等待堆積。由此需要我們自己定義一個線程池策略。ThreadPoolExecutor為我們線程池的設置提供了很大的靈活性。
首先看FixedThreadPool的實現(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
第二個是采用CallerRunsPolicy。ThreadPoolExecutor可以定義不同的任務拒絕策略。CallerRunsPolicy指的是當線程池拒絕該任務的時候,線程在本地線程直接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個線程的時候,10個執(zhí)行線程,10個線程放入了workingQueue。當提交到第21個線程的時候,會觸發(fā)RejectedExecutionHandler。在這里我們配置了CallerRunsPolicy策略。所以會在主線程直接執(zhí)行該線程。也就是說,在本程序中最多會有11個線程在執(zhí)行,10個線程在等待。由此限制了線程池的等待線程數(shù)與執(zhí)行線程數(shù)
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/64881.html
摘要:去美團面試,問到了什么是線程池,如何使用,為什么要用以下做個總結。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時以及周期性執(zhí)行任務的需求。 去美團面試,問到了什么是線程池,如何使用,為什么要用,以下做個總結。關于線程之前也寫過一篇文章《高級面試題總結—線程池還能這么玩?》 1、什么是線程池:? java.util...
摘要:去美團面試,問到了什么是線程池,如何使用,為什么要用以下做個總結。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時以及周期性執(zhí)行任務的需求。 去美團面試,問到了什么是線程池,如何使用,為什么要用,以下做個總結。關于線程之前也寫過一篇文章《高級面試題總結—線程池還能這么玩?》 1、什么是線程池:? java.util...
摘要:限期阻塞調用方法等待時間結束或線程執(zhí)行完畢。終止狀態(tài)線程執(zhí)行完畢或出現(xiàn)異常退了。和都會檢查線程何時中斷,并且在發(fā)現(xiàn)中斷時提前放回。工廠方法將線程池的最大大小設置為,而將基本大小設置為,并將超時大小設置為分鐘。 wait()、notify()、notifyAll() Object是所有類的基類,它有5個方法組成了等待、通知機制的核心:notify()、notifyAll()、wait()...
摘要:最近項目中越來越多需要異步調用的地方,系統(tǒng)中雖有線程池管理,但還有可優(yōu)化的空間,通過分享該文章,幫助大家了解線程池,同時學習使用線程池開啟線程需要注意的地方。沒錯,上述方法創(chuàng)建的線程池就是。線程池就是程序中的裝修公司,代勞各種臟活累活。 最近項目中越來越多需要異步調用的地方,系統(tǒng)中雖有線程池管理,但還有可優(yōu)化的空間,通過分享該文章,幫助大家了解線程池,同時學習使用線程池開啟線程需要注意...
閱讀 2270·2021-11-15 11:38
閱讀 1218·2021-09-06 15:02
閱讀 3476·2021-08-27 13:12
閱讀 1464·2019-08-30 14:20
閱讀 2461·2019-08-29 15:08
閱讀 712·2019-08-29 14:08
閱讀 1778·2019-08-29 13:43
閱讀 1573·2019-08-26 12:11