线程技术实现.pdfVIP

  • 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 就释放了

文档评论(0)

1亿VIP精品文档

相关文档