Java线程是如何实现的?

当我们追踪Java线程的实现时,可以发现Thread类的start方法最后会运行一个start0方法,而这个方法是native的,也就是交由JDK来实现的(JDK会屏蔽调底层操作系统的差异,提供给Java开发者一套通用的线程接口) 而要搞清楚这个问题的答案,首页我们得对线程的实现有一定的了解。 线程的主要实现方式有3种(线程模型),分别是使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。

使用内核线程实现

  • 优点: 一个线程被阻塞也不会影响整个进程工作。

  • 缺点:

  1. 各种线程操作(如创建、析构及同步等)都需要进行系统调用,性能消耗高在用户态和内核态来回切换。
  2. 线程和内核线程一比一,内核线程也是要消耗资源的(如内核线程栈空间),所以支持的数量是有限的。

使用用户线程实现

  • 优点: 用户线程的创建、同步、销毁及调度完全是在用户态中完成,不需要切换到内核态,因此操作是快速且低消耗的。

  • 缺点: 因为没有内核的支持,线程的所有操作都需要用户程序自己实现,实现异常复杂。操作系统只把处理器资源分配到进程,“阻塞如何处理”,“多处理器系统如何将线程映射到其他处理器上”这类问题,甚至不可能解决。

使用用户线程加轻量级线程混合实现

  • 优点: 混合前2种的优点; 用户线程操作快速且低消耗,支持更多的并发;一个线程阻塞也不会导致整个进程阻塞。
  • 缺点: 实现相对复杂,且需要操作系统对应支持。

Java线程的实现

Java线程的调度

参考文档

  • 书籍:周志明 *《深入理解Java虚拟机》