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

66 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 线程的实现
线程是 Java 里进行处理器资源调度的最基本单位,
实现线程有三种方式:
1. **内核线程实现**
也称 1:1实现
直接由操作系统内核支持的线程,
由内核来完成线程切换,
内核通过调度器对线程进行调度,并负责将线程的任务映射到各个处理器上
1. **用户线程实现**
也称 1N 实现,
一个线程只要不是内核线程,都可以是用户线程,
狭义上是完全建立在用户空间的线程库上,
系统内核不能感知到用户线程。
用户线程的建立、同步、销毁、调度完全在用户态中完成
1. **用户线程加轻量级进程混合实现**
称为 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)
已终止线程的线程状态