### 线程的实现 线程是 Java 里进行处理器资源调度的最基本单位, 实现线程有三种方式: 1. **内核线程实现** 也称 1:1实现, 直接由操作系统内核支持的线程, 由内核来完成线程切换, 内核通过调度器对线程进行调度,并负责将线程的任务映射到各个处理器上 1. **用户线程实现** 也称 1:N 实现, 一个线程只要不是内核线程,都可以是用户线程, 狭义上是完全建立在用户空间的线程库上, 系统内核不能感知到用户线程。 用户线程的建立、同步、销毁、调度完全在用户态中完成 1. **用户线程加轻量级进程混合实现** 称为 N:M 实现, 在混合模式下, 既存在用户线程,也存在轻量级进程 Java 虚拟机线程模型为基于操作系统原始线程模型来实行, 即采用 1:1的线程模型 ### Java 线程调度 **协同式线程调度** 线程的执行时间有线程本身来控制, 线程把自己的工作执行完成之后, 主动通知系统切换到另一个线程上 **抢占式线程调度** 每个线程由系统来分配时间, 线程的切换不由线程本身决定 ### 状态转换 Java 定义了 6 种线程状态,一个线程在一个时间点只能有其中一种状态 - **新建**(New): 创建后尚未启动的线程 - **运行**(Runnable): 包括操作系统线程状态中的 Running 和 Ready, 也就是线程有可能正在执行,也有可能在等待操作系统分配执行时间 - **无限期等待**(Waiting): 处于这种状态的线程不会被分派处理器执行时间, 它们要等待被其他线程显示唤醒。 以下方法会让线程陷入无限期等待的状态: - 没有设置 Timeout 参数的 Object::wait()方法 - 没有设置 Timeout 参数的 Thread::join()方法 - LockSupport::park()方法 - **限期等待**(Timed Waiting): 处于这种状态的线程也不会被分配处理器执行时间, 无需等待其它线程显示唤醒,一定时间后由系统自动唤醒。 以下方法会让线程进入限期等待的状态: - Thread::sleep()方法 - 设置了 Timeout 参数的 Object:: wait ()方法 - 设置了 Timeout 参数的 Thread:: join ()方法 - LockSupport::parkNanos()方法 - LockSupport::parkUntil()方法 - **阻塞**(Blocked): 线程被阻塞了,等待着获取到一个排他锁, 这个事件将在另一个线程放弃这个锁的时候发生 - **结束**(Terminated): 已终止线程的线程状态