- 0
- 0
- 约1.36万字
- 约 7页
- 2021-10-09 发布于湖南
- 举报
1. 线程的挂起和唤醒
挂起实际上是让线程进入“非可执行”状态下,在这个状态下 CPU 不会分给线程时间
片,进入这个状态可以用来暂停一个线程的运行; 在线程挂起后, 可以通过重新唤醒线程来
使之恢复运行。
挂起的原因可能是如下几种情况:
(1)通过调用 sleep() 方法使线程进入休眠状态,线程在指定时间内不会运行。
(2 )通过调用 join() 方法使线程挂起,使自己等待另一个线程的结果,直到另一个线程执
行完毕为止。
(3 )通过调用 wait() 方法使线程挂起,直到线程得到了 notify() 和 notifyAll() 消息,线
程才会进入“可执行”状态。
(4 )使用 suspend 挂起线程后,可以通过 resume 方法唤醒线程。
虽然 suspend 和 resume 可以很方便地使线程挂起和唤醒,但由于使用这两个方法可能
会造成死锁,因此,这两个方法被标识为 deprecated (抗议)标记 ,这表明在以后的 jdk
版本中这两个方法可能被删除,所以尽量不要使用这两个方法来操作线程。
调用 sleep() 、yield() 、suspend() 的时候并没有被释放锁
调用 wait() 的时候释放当前对象的锁
wait() 方法表示, 放弃当前对资源的占有权, 一直等到有线程通知, 才会运行后面的代
码。
notify() 方法表示, 当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源
的占有权,但是只有一个线程能够从 wait 状态中恢复,然后继续运行 wait() 后面的语句。
notifyAll() 方法表示,当前的线程已经放弃对资源的占有,通知所有的等待线程从
wait() 方法后的语句开始运行。
2. 等待和锁实现资源竞争
等待机制与锁机制是密切关联的, 对于需要竞争的资源,首先用 synchronized 确保这
段代码只能一个线程执行, 可以再设置一个标志位 condition 判断该资源是否准备好, 如果
没有,则该线程释放锁,自己进入等待状态,直到接收到 notify ,程序从 wait 处继续向下
执行。
1. synchronized ( obj ) {
2. while (! condition ) {
3. obj . wait ();
4. }
5. obj . doSomething ();
6. }
以上程序表示只有一个线程 A 获得了 obj 锁后, 发现条件 condition 不满足, 无法继续
下一处理,于是线程 A 释放该锁,进入 wait() 。
在另一线程 B 中,如果 B 更改了某些条件, 使得线程 A 的 condition 条件满足了, 就
可以唤醒线程 A:
1. synchronized ( obj ) {
2. condition = true ;
3. obj . notify ();
4. }
需要注意的是:
# 调用 obj 的 wait(), notify() 方法前,必须获得 obj 锁,也就是必须写在
synchronized(obj) {...} 代码段内。
# 调用 obj.wait() 后,线程 A 就释放了
您可能关注的文档
最近下载
- 一种水性双组份环氧底漆及其制备方法和应用.pdf VIP
- 2021版 客户侧电能计量装置通用设计要求 第2部分 低压用电客户电能计量装置.docx VIP
- 一种水性环氧涂层及其制备方法与应用.pdf VIP
- NK材料——材料分析测试方法.pptx VIP
- 一种水性环氧防腐底漆及其制备方法.pdf VIP
- 特种设备安全教育培训记录.pdf VIP
- 东芝CV330A封线分析和总结.docx VIP
- 父母赠予金钱合同协议书.docx VIP
- 2021版 客户侧电能计量装置通用设计要求 第1部分 10kV用电客户电能计量装置.docx VIP
- 2025年湖南工艺美术职业学院单招英语考试题库及答案解析.docx VIP
原创力文档

文档评论(0)