Java线程模型与线程调度

线程模型:
    Sun JDK的windows版和Linux版都是使用 1对1的线程模型实现的,一条Java线程映射到一条轻量级进程之中。
    内核线程(Kernel-Level Thread, KLT)是直接由操作系统内核(Kernel,下称内核)支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。程序一般不会去使用内核线程,而是使用内核线程的一种高级接口—— 轻量级进程(Light Weight Process, LWP)

Java线程模型与线程调度_第1张图片
线程调度:
        线程分配处理器使用权的过程,主要有两种:协同式线程调度(Cooperative Thread-Scheduling)和抢占式线程调度(Preemptive Threads-Scheduling), Java使用的抢占式线程调度,通过设置线程优先级“建议”系统给有些线程多分配时间,并不一定(比如Windows操作系统优先级7种,Java有10种,那么有些优先级映射到系统原生线程后就是一样的)
        抢占模式下,操作系统负责分配CPU时间给各个进程,一旦当前的进程使用完分配给自己的CPU时间,操作系统将决定下一个占用CPU时间的是哪一个线程。因此操作系统将定期的中断当前正在执行的线程,将CPU分配给在等待队列的下一个线程。所以任何一个线程都不能独占CPU。每个线程占用CPU的时间取决于进程和操作系统。进程分配给每个线程的时间很短,以至于我们感觉所有的线程是同时执行的。实际上,系统运行每个进程的时间有2毫秒,然后调度其他的线程。它同时他维持着所有的线程和循环,分配很少量的CPU时间给线程。线程的的切换和调度是如此之快,以至于感觉是所有的线程是同步执行的。  
        在非抢占的调度模式下,每个线程可以需要CPU多少时间就占用CPU多少时间。在这种调度方式下,可能一个执行时间很长的线程使得其他所有需要CPU的线程”饿死”。在处理机空闲,即该进程没有使用CPU时,系统可以允许其他的进程暂时使用CPU。占用CPU的线程拥有对CPU的控制权,只有它自己主动释放CPU时,其他的线程才可以使用CPU。

(参考 深入理解Java虚拟机)

你可能感兴趣的:(JVM)