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