更多博客请见 我的语雀知识库

在 JDK 1.2 及以后,JVM 选择了更加稳定且方便使用的操作系统原生的内核级线程,通过系统调用,将线程的调度交给了操作系统内核。而操作系统内核线程和Java线程有一对一、一对多、多对多这几种模型。具体与操作系统有关。

线程模型

多对一模型

多个用户级线程对应到某一个内核线程上

一对一模型

一个用户级线程对应一个内核态线程

多对多模型

任意数量的用户线程复用到相同或更少数量的内核线程上,结合了一对一和多对一模型的最佳特性

现今 Java 中线程的本质,其实就是操作系统中的线程,其线程库和线程模型很大程度上依赖于操作系统(宿主系统)的具体实现(一对一,多对一),比如在 Windows 中 Java 就是基于 Win32 线程库来管理线程,且 Windows 采用的是一对一的线程模型。

关于线程库

线程库就是为开发人员提供创建和管理线程的一套 API。 当然,线程库不仅可以在用户空间中实现,还可以在内核空间中实现。前者涉及仅在用户空间内实现的 API 函数,没有内核支持。后者涉及系统调用,也就是说调用库中的一个 API 函数将会导致对内核的系统调用,并且需要具有线程库支持的内核。

三个主要的线程库: 1)POSIX Pthreads:可以作为用户或内核库提供,作为 POSIX 标准的扩展 2)Win32 线程:用于 Window 操作系统的内核级线程库 3)Java 线程:Java 线程 API 通常采用宿主系统的线程库来实现,也就是说在 Win 系统上,Java 线程 API 通常采用 Win API 来实现,在 UNIX 类系统上,采用 Pthread 来实现。

力扣