2.5 KiB
2.5 KiB
线程的实现
线程是 Java 里进行处理器资源调度的最基本单位, 实现线程有三种方式:
- 内核线程实现 也称 1:1实现, 直接由操作系统内核支持的线程, 由内核来完成线程切换, 内核通过调度器对线程进行调度,并负责将线程的任务映射到各个处理器上
- 用户线程实现 也称 1:N 实现, 一个线程只要不是内核线程,都可以是用户线程, 狭义上是完全建立在用户空间的线程库上, 系统内核不能感知到用户线程。 用户线程的建立、同步、销毁、调度完全在用户态中完成
- 用户线程加轻量级进程混合实现 称为 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): 已终止线程的线程状态