Files
Hui-s-notebook/Java与线程.md
2023-09-10 10:50:53 +08:00

2.5 KiB
Raw Blame History

线程的实现

线程是 Java 里进行处理器资源调度的最基本单位, 实现线程有三种方式:

  1. 内核线程实现 也称 1:1实现 直接由操作系统内核支持的线程, 由内核来完成线程切换, 内核通过调度器对线程进行调度,并负责将线程的任务映射到各个处理器上
  2. 用户线程实现 也称 1N 实现, 一个线程只要不是内核线程,都可以是用户线程, 狭义上是完全建立在用户空间的线程库上, 系统内核不能感知到用户线程。 用户线程的建立、同步、销毁、调度完全在用户态中完成
  3. 用户线程加轻量级进程混合实现 称为 NM 实现, 在混合模式下, 既存在用户线程,也存在轻量级进程

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) 已终止线程的线程状态