您好,登錄后才能下訂單哦!
這篇文章主要介紹“web開發中使用無界隊列的線程池會不會導致內存飆升”,在日常操作中,相信很多人在web開發中使用無界隊列的線程池會不會導致內存飆升問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”web開發中使用無界隊列的線程池會不會導致內存飆升”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Executors創建線程池方式有如下幾種:
Executors.newFixedThreadPool(10);//LinkedBlockingQueue 無限加入隊列 Executors.newScheduledThreadPool(10);//DelayedWorkQueue 隊列如果滿了,阻塞 Executors.newSingleThreadScheduledExecutor();//DelayedWorkQueue 隊列如果滿了,阻塞 Executors.newCachedThreadPool();//SynchronousQueue 隊列如果滿了,拋異常 Executors.newSingleThreadExecutor();//LinkedBlockingQueue 無限加入隊列
本文以Executors.newFixedThreadPool為例 定長線程池,核心線程數和最大線程數由用戶傳入,超出在隊列等待,以下為相關源碼。
//newFixedThreadPool創建線程池源碼 public static ExecutorService newFixedThreadPool(int nThreads){ /** * corePoolSize : 核心線程的數量為自定義輸入nThreads * maximumPoolSize : 最大線程的數量為自定義輸入nThreads * keepAliveTime : 0L * unit : 秒 * workQueue : LinkedBlockingQueue **/ return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
newFixedThreadPool和SingleThreadExecutor類似,唯一的區別就是核心線程數不同,并且由于使用的是LinkedBlockingQueue。LinkedBlockingQueue默認的最大任務數量是Integer.MAX_VALUE,非常大,可以理解為無限大吧;但是存在這種情況,當每個線程獲取到一個任務后,執行時間比較長,導致workQueue里積壓的任務越來越多,機器的內存使用不停的飆升,最后也會導致OOM。 jdk7提供了7個阻塞隊列,分別是:
ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列 LinkedBlockingQueue:一個由鏈表結構組成的有界阻塞隊列 PriorityBlockingQueue:一個支持優先級排序的無界阻塞隊列 DelayQueue:一個使用優先級隊列實現的無界阻塞隊列 SynchronousQueue:一個不存儲元素的阻塞隊列 LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列 LinkedBlockingDueue:一個 由鏈表結構組成的雙向阻塞隊列
線程池工作原理圖解:
到此,關于“web開發中使用無界隊列的線程池會不會導致內存飆升”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。