线程是比进程更轻量的调度单位,线程可以共享进程资源(内存地址、文件I/O等),又可以独自调度。
Java中,线程是处理器执行调度的最基本单位。
主流操作系统都提供了线程实现,Java语言提供了不同操作系统平台和不同硬件下对线程的同一处理。
内核线程(Kernel-level Thread,KLT)是操作系统内核支持的线程,操作系统内核通过操作调度器(Scheduler)对内核线程进行调度切换,并将内核线程任务映射到各个处理器上,内核线程可以称为处理器的分身。从而让每个处理器具有处理多事务的能力。支持多线程的内核称为多线程内核(Multi-Threads Kernel)。由于受内核和处理器限制,内核线程数是受限的,不能大规模创建和并发。
轻量级进程是指内核线程的高级接口,每个轻量级进程都需要内核线程支持。通常开发不会直接使用内核线程,而是通过内核线程的高级接口使用轻量级进程,轻量级进程通常也称为用户线程。轻量级进程和内核线程是1对1的关系。
广义上说只要不是内核线程都是用户线程,从定义上轻量级进程也属于用户线程,但是,轻量级进程的调度是建立在系统内核之上的,是由操作系统进行调度的,在效率上收到限制,不具备用户线程的优点。
狭义上说,用户线程是建立在用户空间的线程,系统内核是感知不到用户空间的线程的,用户空间的线程的建立、同步、销毁、调度都是有用户空间自己完成的,不需要内核的帮助。
由于轻量级进程是内核线程支持的,即使某个轻量级进程被堵塞了,也不会影响整个进程继续工作。轻量级进程也有一定的局限,由于轻量级进程是内核线程支持的,轻量级进程的创建、析构、同步都需要系统调用,而系统调用代价相对较高,需要在内核态和用户态进行切换。
内核线程和用户线程一起使用的模式,就是多对多的关系,这种关系下即有用户线程,也有轻量级进程。用户线程依然建立在用户空间,用户线程的建立、切换、析构和同步都需要用户空间维护,可以支持大规模并发实现。