http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html
Linux從內核2.6開始使用NPTL (Native POSIX Thread Library)支持,但這時線程本質上還輕量級進程。
Java里的線程是由JVM來管理的。它怎樣相應到操作系統的線程是由JVM的實現來確定的。
Linux 2.6上的HotSpot使用了NPTL機制,JVM線程跟內核輕量級進程有一一相應的關系。線程的調度全然交給了操作系統內核。當然jvm還保留一些策略足以影響到其內部的線程調度。舉個樣例。在linux下,僅僅要一個Thread.run就會調用一個fork產生一個線程。
Java線程在Windows及Linux平台上的實現方式,如今看來,是內核線程的實現方式。這樣的方式實現的線程,是直接由操作系統內核支持的——由內核完畢線程切換,內核通過操縱調度器(Thread Scheduler)實現線程調度,並將線程任務反映到各個處理器上。內核線程是內核的一個分身。程序一般不直接使用該內核線程,而是使用其高級接口,即輕量級進程(LWP)。也即線程。
這看起來可能非常拗口。看圖:
(說明:KLT即內核線程Kernel Thread,是“內核分身”。
每個KLT相應到進程P中的某一個輕量級進程LWP(也即線程)。期間要經過用戶態、內核態的切換,並在Thread Scheduler 下反應到處理器CPU上。)
java程序里我們能夠通過以下的一行代碼得到這個數量:
假設我們僅僅擁有與內核數量一樣多的線程。即使我們有任務要運行,他們也不能運行。由於處理器沒有能夠用來調度的線程。
假設有很多其它的時間被堵塞。那么就是IO密集型的程序,則能夠開辟很多其它的線程。
於是我們能夠得到以下的線程數量計算公式: