## Java线程是如何实现的?
当我们追踪Java线程的实现时,可以发现Thread类的start方法最后会运行一个start0方法,而这个方法是native的,也就是交由JDK来实现的(JDK会屏蔽调底层操作系统的差异,提供给Java开发者一套通用的线程接口)
![](https://img.kancloud.cn/c3/9c/c39c09e3679345c086a6a03f3395845e_1590x1386.png)
而要搞清楚这个问题的答案,首页我们得对线程的实现有一定的了解。
线程的主要实现方式有3种(线程模型),分别是使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。
## 使用内核线程实现
![](https://img.kancloud.cn/46/c2/46c24bd8a92de971fba63f97cba705ee_1710x1376.png)
* 优点:
一个线程被阻塞也不会影响整个进程工作。
* 缺点:
1. 各种线程操作(如创建、析构及同步等)都需要进行系统调用,性能消耗高在用户态和内核态来回切换。
2. 线程和内核线程一比一,内核线程也是要消耗资源的(如内核线程栈空间),所以支持的数量是有限的。
## 使用用户线程实现
![](https://img.kancloud.cn/b6/e2/b6e2895f16b190f06aa708a751486012_1704x1144.png)
* 优点:
用户线程的创建、同步、销毁及调度完全是在用户态中完成,不需要切换到内核态,因此操作是快速且低消耗的。
* 缺点:
因为没有内核的支持,线程的所有操作都需要用户程序自己实现,实现异常复杂。操作系统只把处理器资源分配到进程,“阻塞如何处理”,“多处理器系统如何将线程映射到其他处理器上”这类问题,甚至不可能解决。
## 使用用户线程加轻量级经常混合实现
![](https://img.kancloud.cn/30/da/30da7a374ba329b62836c9e1968e5cee_1704x1368.png)
* 优点:
混合前2种的优点;
用户线程操作快速且低消耗,支持更多的并发;一个线程阻塞也不会导致整个进程阻塞。
* 缺点:
实现相对复杂,且需要操作系统对应支持。
## Java线程的实现
![](https://img.kancloud.cn/20/4b/204ba552ae0f1a24d43c83e38ec68cc0_1476x838.png)
## Java线程的调度
![](https://img.kancloud.cn/dc/11/dc114872bef8b6b0afffbfdc01960e08_1398x958.png)
## 参考文档
* 书籍:周志明 *《深入理解Java虚拟机》
- 面试突击
- Java虚拟机
- 认识字节码
- 000Java发展历史
- 000Macos10.15.7上编译OpenJDK8u
- 001熟悉Java内存区域
- 002熟悉HotSpot中的对象
- 003Java如何计算对象大小
- 004垃圾判定算法与4大引用
- 005回收堆和方法区中对象
- 006垃圾收集算法
- 007HotSpot虚拟机垃圾算法实现篇1
- 007HotSpot虚拟机垃圾算法实现篇2
- 007HotSpot虚拟机垃圾算法实现篇3
- 008垃圾收集器
- 009内存分配与回收策略
- 010Java虚拟机相关工具
- 011调优案例分析
- 012一次IDEA的启动速度调优
- 013类文件Class的结构
- 014熟悉字节码指令
- 015类加载机制(过程)
- 016类加载器
- IDEA的JVM参数
- Java基础
- Java自动装箱与拆箱
- Java基础数据类型
- Java方法的参数传递
- Java并发
- 001走入并行的世界
- 002并行程序基础
- 003熟悉Java内存模型JMM
- 004Java并发之volatile关键字
- 005线程池入门到精通
- 006Java多线程间的同步控制方法
- 007Java维基准测试框架JMH
- 008Java并发容器
- 009Java的线程实现
- 010Java关键字synchronized
- 011一些并行模式的熟悉
- 单例模式和不变模式
- 生产者消费者模式
- Future模式
- 012一些并行算法的熟悉
- 面试总结
- 长亮一面