Java线程与Linux内核线程的映射关系Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。 html
Java里的线程是由JVM来管理的,它如何对应到操做系统的线程是由JVM的实现来肯定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一对应的关系。线程的调度彻底交给了操做系统内核,固然jvm还保留一些策略足以影响到其内部的线程调度,举个例子,在linux下,只要一个Thread.run就会调用一个fork产生一个线程。java
Java线程在Windows及Linux平台上的实现方式,如今看来,是内核线程的实现方式。这种方式实现的线程,是直接由操做系统内核支持的——由内核完成线程切换,内核经过操纵调度器(Thread Scheduler)实现线程调度,并将线程任务反映到各个处理器上。内核线程是内核的一个分身。程序通常不直接使用该内核线程,而是使用其高级接口,即轻量级进程(LWP),也即线程。这看起来可能很拗口。看图:linux
(说明:KLT即内核线程Kernel Thread,是“内核分身”。每个KLT对应到进程P中的某一个轻量级进程LWP(也即线程),期间要通过用户态、内核态的切换,并在Thread Scheduler 下反应处处理器CPU上。)swift
这种线程实现的方式也有它的缺陷:在程序面上使用内核线程,必然在操做系统上屡次来回切换用户态及内核态;另外,由于是一对一的线程模型,LWP的支持数是有限的。jvm
Runtime.getRuntime().availableProcessors();
因此最小线程数量即时cpu内核数量。若是全部的任务都是计算密集型的,这个最小线程数量就是咱们须要的线程数。开辟更多的线程只会影响程序的性能,由于线程之间的切换工做,会消耗额外的资源。若是任务是IO密集型的任务,咱们能够开辟更多的线程执行任务。当一个任务执行IO操做的时候,线程将会被阻塞,处理器马上会切换到另一个合适的线程去执行。若是咱们只拥有与内核数量同样多的线程,即便咱们有任务要执行,他们也不能执行,由于处理器没有能够用来调度的线程。工具