线程的创建开销大吗?线程创建开销包括哪些?线程池
1-1. 關于時間,創建線程使用是直接向系統申請資源的,這里調用系統函數進行分配資源的話耗時不好說。 關于資源,Java線程的線程棧所占用的內存是在Java堆外的,所以是不受java程序控制的,只受系統資源限制,默認一個線程的線程棧大小是1M(當讓這個可以通過設置-Xss屬性設置,但是要注意棧溢出問題),但是,如果每個用戶請求都新建線程的話,1024個用戶光線程就占用了1個G的內存,如果系統比較大的話,一下子系統資源就不夠用了,最后程序就崩潰了。
PS:同樣的道理在java程序中也不要隨意開啟新的線程,特別是高頻業務盡量使用線程池,不然很容易導致內存不足,程序崩潰的問題。
1-2. 對操作系統來說,創建一個線程的代價是十分昂貴的, 需要給它分配內存、列入調度,同時在線程切換的時候還要執行內存換頁,CPU 的緩存被 清空,切換回來的時候還要重新從內存中讀取信息,破壞了數據的局部性。
參考文章:線程創建開銷包括哪些?
2-1.
完成一項任務的時間為T :
T1 創建線程的時間
T2 在線程中執行任務的時間,包括線程間同步所需時間
T3 線程銷毀的時間
顯然T = T1+T2+T3。注意這是一個極度簡化的假設。可以看出T1,T3是多線程本身的帶來的開銷,我們渴望減少T1,T3所用的時間,從而減少T的時間。但一些線程的使用者并沒有注意到這一點,所以在程序中頻繁的創建或銷毀線程,這導致T1和T3在T中占有相當比例。顯然這是突出了線程的弱點(T1,T3),而不是優點(并發性)。
具體到數據,需要看你的系統要求。如果系統出現這樣的情況就應該采用線程池!
你應該都比較常聽過線程池,連接池的名詞。這次都是池化技術。
為什么要將對象池化,因為這些對象是被經常使用的,比如線程,比如數據庫連接;同時,頻繁創建這些對象又是比較消耗資源(包括時間)的;還有個特點,這些對象雖然經常被使用但不是象一個循環一樣一直在不間斷運行,它是有間隔性的運行。
于是在系統運行一開始就創建一定數量的這樣的對象,比如100個線程和100個數據庫連接,將它們統一管理(利用一個管理對象來控制,我們可以把這個對象叫作線程池,連接池,對象池等),一旦系統需要這些對象的支持時,就由這個管理對象(線程池,連接池)返回一個沒有被利用(沒有運行業務代碼的)對象來執行所需的要求。
這種技術就是池化。更多的可以看IBM的線程池教程。還有很多的開源項目都大量采用此類技術(來提高性能)
總結
以上是生活随笔為你收集整理的线程的创建开销大吗?线程创建开销包括哪些?线程池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 面向对象的篮球技巧训练实现
- 下一篇: python 如何将数字字符串转换为数字