摘要:線程池的工作原理一個線程池管理了一組工作線程,同時它還包括了一個用于放置等待執行任務的任務隊列阻塞隊列。使用線程池可以對線程進行統一的分配和監控。線程池的注意事項雖然線程池是構建多線程應用程序的強大機制,但使用它并不是沒有風險的。
線程池的工作原理
一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執行
任務的任務隊列(阻塞隊列) 。
一個線程池管理了一組工作線程, 同時它還包括了一個用于放置等待執行
任務的任務隊列(阻塞隊列) 。
默認情況下, 在創建了線程池后, 線程池中的線程數為 0。 當任務提交給
線程池之后的處理策略如下:
1 如果此時線程池中的數量小于 corePoolSize(核心池的大小) , 即使線程池中的線程都處于空閑狀態, 也要創建新的線程來處理被添加的任務(也就是每來一個任務, 就要創建一個線程來執行任務) 。
2 如果此時線程池中的數量大于等于 corePoolSize, 但是緩沖隊列workQueue 未滿, 那么任務被放入緩沖隊列, 則該任務會等待空閑線程將其取出去執行。
3 如果此時線程池中的數量大于等于 corePoolSize , 緩 沖 隊 列workQueue 滿, 并且線程池中的數量小于 maximumPoolSize(線程池最大線程數) , 建新的線程來處理被添加的任務。
4 如果 此時 線程 池中 的數量 大 于 等 于 corePoolSize, 緩 沖 隊列workQueue 滿, 并且線程池中的數量等于 maximumPoolSize, 那么通過RejectedExecutionHandler 所指定的策略(任務拒絕策略)來處理此任務。也就是處理任務的優先級為: 核心線程 corePoolSize、 任務隊列workQueue、 最大線程 maximumPoolSize, 如果三者都滿了, 使用handler 處理被拒絕的任務。
特別注意, 在 corePoolSize 和 maximumPoolSize 之間的線程數會被自動釋放。 當線程池中線程數量大于 corePoolSize 時, 如果某線程空閑時間超過 keepAliveTime, 線程將被終止, 直至線程池中的線程數目不大于 corePoolSize。 這樣, 線程池可以動態的調整池中的線程數。
使用線程池的好處
1.通過重復利用已創建的線程, 減少在創建和銷毀線程上所花的時間以及系統資源的開銷。
2.提高響應速度。 當任務到達時, 任務可以不需要等到線程創建就可以立即行。
3.提高線程的可管理性。 使用線程池可以對線程進行統一的分配和監控。
4.如果不使用線程池, 有可能造成系統創建大量線程而導致消耗完系統內存。
線程池的注意事項
雖然線程池是構建多線程應用程序的強大機制, 但使用它并不是沒有風險的。
(1) 線程池的大小。 多線程應用并非線程越多越好, 需要根據系統運行的軟硬件環境以及應用本身的特點決定線程池的大小。 一般來說, 如果代碼結構合理的話, 線程數目與 CPU數量相適合即可。 如果線程運行時可能出現阻塞現象, 可相應增加池的大小; 如有必要可采用自適應算法來動態調整線程池的大小, 以提高 CPU 的有效利用率和系統的整體性能。
(2) 并發錯誤。 多線程應用要特別注意并發錯誤, 要從邏輯上保證程序的正確性, 注意避免死鎖現象的發生。
(3) 線程泄漏。 這是線程池應用中一個嚴重的問題, 當任務執行完畢而線程沒能返回池中就會發生線程泄漏現象。
學習交流群:669823128
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70434.html
摘要:當活動線程核心線程非核心線程達到這個數值后,后續任務將會根據來進行拒絕策略處理。線程池工作原則當線程池中線程數量小于則創建線程,并處理請求。當線程池中的數量等于最大線程數時默默丟棄不能執行的新加任務,不報任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點記錄以及采用的解決方案 深入分析 java 線程池的實現原理 在這篇文章中,作者有條不紊的將 ja...
摘要:每個通過網絡到達服務器的連接都被包裝成一個任務并且傳遞給線程池。線程池的線程會并發的處理連接上的請求。用線程池控制線程數量,其他線程排隊等候。實現包,線程池頂級接口是但是嚴格意義講并不是一個線程。此線程池支持定時以及周期性執行任務的需求。 tutorial site1tutorial site2 一個問題: 每啟動一個新線程都會有相應的性能開銷(涉及到OS的交互:創建線程,銷毀線程...
摘要:本文只介紹中線程池的基本使用,不會過多的涉及到線程池的原理。可緩存線程的線程池創建一個可緩存線程的線程池。首先是從接口繼承到的方法使用該方法即將一個任務交給線程池去執行。方法方法的作用是向線程池發送關閉的指令。 首先,我們為什么需要線程池?讓我們先來了解下什么是 對象池 技術。某些對象(比如線程,數據庫連接等),它們創建的代價是非常大的 —— 相比于一般對象,它們創建消耗的時間和內存都...
閱讀 3735·2021-11-24 10:46
閱讀 1706·2021-11-15 11:38
閱讀 3761·2021-11-15 11:37
閱讀 3481·2021-10-27 14:19
閱讀 1939·2021-09-03 10:36
閱讀 1991·2021-08-16 11:02
閱讀 2998·2019-08-30 15:55
閱讀 2251·2019-08-30 15:44