参考文献

JVM线程模型

线程创建和销毁

  • 在语言层面,线程对应的类是java.lang.Thread,启动方法为Thread#start()
  • Java线程启动时会创建底层线程(native Thread,在任务执行完成后会自动回收。
  • JVM中所有线程都交给操作系统来负责调度,以将线程分配到可用的 CPU 上执行

线程状态

  • JVM的角度看,线程状态主要包括 4 种:
    • _thread_new:正在初始化的新线程
    • _thread_in_Java:正在执行 Java 代码的线程
    • _thread_in_vm:在 JVM 内部执行的线程
    • _thread_blocked:由于某种原因被阻塞的线程(例如获取锁、等待条件、休眠、执行阻塞的 I/O 操作等等)

JVM内部线程

  • JVM 内部线程主要分为以下几种:

    • VM 线程: 单例的VMThread对象,负责执行 VM 操作,下文将对此进行讨论;
    • 定时任务线程: 单例的WatcherThread对象,模拟在 VM 中执行定时操作的计时器中断;
    • GC 线程: 垃圾收集器中,用于支持并行和并发垃圾回收的线程;
    • 编译器线程: 将字节码编译为本地机器代码;
    • 信号分发线程: 等待进程指示的信号,并将其分配给 Java 级别的信号处理方法。
  • JVM中的所有线程都是Thread实例,而所有执行Java代码的线程都是(Thread的子类)JavaThread的实例。

  • JVM在链表Threads_list中跟踪所有线程,并使用 Threads_lock来保护(这是 JVM 内部使用的一个核心同步锁)。

线程间协调与通信

  • 线程之间有多种通信方式,例如:
    • 线程等待,使用 threadA.join() 方法,可以让当前线程等待另一个线程执行结束后进行“汇合”
    • 同步(Synchronization),包括 synchronized 关键字以及 object.wait()、object.notify()
    • 使用并发工具类,常见的包括 CountdownLatch 类、CyclicBarrier 类等等
    • 可管理的线程池相关接口,比如:FutureTask 类、Callable 接口等等
    • Java 还支持其他的同步机制,例如 volatile 域以及 java.util.concurrent 包(有时候简称 juc)中的类