题目
Java 线程和操作系统的线程有啥区别?
答案
操作系统线程有两种实现方式: 1)**在用户空间中实现线程** 在「早期」的操作系统中,所有的线程都是在「用户空间」下实现的,操作系统只能看到线程所属的进程,而不能看到线程。 在这种实现方式下,我们需要自己定义线程的数据结构、创建、销毁、调度和维护等,这些线程运行在操作系统的某个进程内,然后操作系统直接对进程进行调度。 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210418213806.png) 2)**在内核空间中实现线程** 现在几乎所有的现代操作系统,包括 Windows、Linux、Mac OS X 和 Solaris 等,都支持「内核线程」。 每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,「**支持多线程的内核就叫做多线程内核**」(Multi-Threads Kernel)。 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210418214229.png) 在这种实现方式下,我们可以直接使用操作系统中已经内置好的线程,线程的创建、销毁、调度和维护等,都是直接由操作系统的内核来实现,我们只需要使用系统调用就好了,不需要像用户级线程那样自己设计线程调度等。 > 用户线程和内核线程的对应关系,就称为 “**线程模型**”,有以下三种: > > - 多对一线程模型 > > ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210418222101.png) > > - 一对一线程模型 > > ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210418222219.png) > > - 一对多线程模型 > > ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210418222230.png) --- 对于 Java 来说,**在 JDK 1.2 之前**,Java 线程是基于称为 "绿色线程"(Green Threads)的用户级线程实现的,也就是说设计者们为 JVM 开发了自己的一套线程库或者说线程管理机制。 而**在 JDK 1.2 及以后**,JVM 选择了更加稳定且方便使用的操作系统原生的内核级线程,通过系统调用,将线程的调度交给了操作系统内核。即 Java 的线程很大程度上依赖于操作系统采用什么样的线程模型,这点在不同的平台上没有办法达成一致,JVM 规范中也并未限定 Java 线程需要使用哪种线程模型来实现,可能是一对一,也可能是多对多或多对一。 总结来说,**JDK 1.2 后 Java 线程的本质,其实就是操作系统中的线程**,其线程库(线程库就是为开发人员提供创建和管理线程的一套 API)和线程模型很大程度上依赖于操作系统(宿主系统)的具体实现,比如在 Windows 中 Java 就是基于 Win32 线程库来管理线程,且 Windows 采用的是一对一的线程模型。