Java的线程实现
Java线程是如何实现的?
当我们追踪Java线程的实现时,可以发现Thread类的start方法最后会运行一个start0方法,而这个方法是native的,也就是交由JDK来实现的(JDK会屏蔽调底层操作系统的差异,提供给Java开发者一套通用的线程接口)
而要搞清楚这个问题的答案,首页我们得对线程的实现有一定的了解。
线程的主要实现方式有3种(线程模型),分别是使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。
使用内核线程实现
优点: 一个线程被阻塞也不会影响整个进程工作。
缺点:
- 各种线程操作(如创建、析构及同步等)都需要进行系统调用,性能消耗高在用户态和内核态来回切换。
- 线程和内核线程一比一,内核线程也是要消耗资源的(如内核线程栈空间),所以支持的数量是有限的。
使用用户线程实现
优点: 用户线程的创建、同步、销毁及调度完全是在用户态中完成,不需要切换到内核态,因此操作是快速且低消耗的。
缺点: 因为没有内核的支持,线程的所有操作都需要用户程序自己实现,实现异常复杂。操作系统只把处理器资源分配到进程,“阻塞如何处理”,“多处理器系统如何将线程映射到其他处理器上”这类问题,甚至不可能解决。
使用用户线程加轻量级线程混合实现
- 优点: 混合前2种的优点; 用户线程操作快速且低消耗,支持更多的并发;一个线程阻塞也不会导致整个进程阻塞。
- 缺点: 实现相对复杂,且需要操作系统对应支持。
Java线程的实现
Java线程的调度
参考文档
- 书籍:周志明 *《深入理解Java虚拟机》