66 lines
2.5 KiB
Markdown
66 lines
2.5 KiB
Markdown
### 线程的实现
|
||
|
||
线程是 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):
|
||
已终止线程的线程状态 |