摘要:限制線程池運行線程以及等待線程數量的策略對于所提供的,可以保證可以在內存中有固定數量的線程數運行。指的是當線程池拒絕該任務的時候,線程在本地線程直接。由此限制了線程池的等待線程數與執行線程數
限制Java線程池運行線程以及等待線程數量的策略
對于java.util.concurrent.Executors所提供的FixedThreadPool,可以保證可以在內存中有固定數量的線程數運行。但是由于FixedThreadPool綁定的是LinkedBlockingQueue。隊列的上限沒有限制(默認上限為Integer.MAX_VALUE),不斷的提交新的線程,會造成任務在內存中長時間的堆積。
我們有可能面臨如下的場景,主線程不斷地提交任務線程,希望有固定數量的在線程中運行,也不想造成線程在內存中大量的等待堆積。由此需要我們自己定義一個線程池策略。ThreadPoolExecutor為我們線程池的設置提供了很大的靈活性。
首先看FixedThreadPool的實現:
public static ExecutorService More ...newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), threadFactory); }
可以看到,FixedThreadPool綁定的是LinkedBlockingQueue
第二個是采用CallerRunsPolicy。ThreadPoolExecutor可以定義不同的任務拒絕策略。CallerRunsPolicy指的是當線程池拒絕該任務的時候,線程在本地線程直接execute。這樣就限制了本地線程的循環提交流程。
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循環提交了20個線程的時候,10個執行線程,10個線程放入了workingQueue。當提交到第21個線程的時候,會觸發RejectedExecutionHandler。在這里我們配置了CallerRunsPolicy策略。所以會在主線程直接執行該線程。也就是說,在本程序中最多會有11個線程在執行,10個線程在等待。由此限制了線程池的等待線程數與執行線程數
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64881.html
摘要:去美團面試,問到了什么是線程池,如何使用,為什么要用以下做個總結。二線程池線程池的作用線程池作用就是限制系統中執行線程的數量。真正的線程池接口是。創建固定大小的線程池。此線程池支持定時以及周期性執行任務的需求。 去美團面試,問到了什么是線程池,如何使用,為什么要用,以下做個總結。關于線程之前也寫過一篇文章《高級面試題總結—線程池還能這么玩?》 1、什么是線程池:? java.util...
摘要:去美團面試,問到了什么是線程池,如何使用,為什么要用以下做個總結。二線程池線程池的作用線程池作用就是限制系統中執行線程的數量。真正的線程池接口是。創建固定大小的線程池。此線程池支持定時以及周期性執行任務的需求。 去美團面試,問到了什么是線程池,如何使用,為什么要用,以下做個總結。關于線程之前也寫過一篇文章《高級面試題總結—線程池還能這么玩?》 1、什么是線程池:? java.util...
摘要:最近項目中越來越多需要異步調用的地方,系統中雖有線程池管理,但還有可優化的空間,通過分享該文章,幫助大家了解線程池,同時學習使用線程池開啟線程需要注意的地方。沒錯,上述方法創建的線程池就是。線程池就是程序中的裝修公司,代勞各種臟活累活。 最近項目中越來越多需要異步調用的地方,系統中雖有線程池管理,但還有可優化的空間,通過分享該文章,幫助大家了解線程池,同時學習使用線程池開啟線程需要注意...
閱讀 2194·2021-11-15 11:38
閱讀 1154·2021-09-06 15:02
閱讀 3389·2021-08-27 13:12
閱讀 1359·2019-08-30 14:20
閱讀 2395·2019-08-29 15:08
閱讀 642·2019-08-29 14:08
閱讀 1728·2019-08-29 13:43
閱讀 1465·2019-08-26 12:11