文章目录
wait notify notifyAll 作用 用法
- wait notify notifyAll 作用 用法
- wait的基本用法demo
wait notify notifyAll 作用 在不同的阶段
- 阻塞阶段 阻塞状态的线程 ,直到遇到下列四种情况之一的时候, 才会被唤醒
- 另一个线程调用这个对象的notify()方法, 刚好唤醒的是本线程 . (notify只会选取一个线程去唤醒. )
- 另一个线程调用这个对象的notifyAll()方法
- 过了wait(long timeout)规定的超时时间, 如果传入的是0 , 那么就进入了永久的等待.
- 在等待的过程中, 调用了interrupt, 被中断了
- 唤醒状态 wait notify 都必须在synchronized 保护的代码块中去执行. 否则会抛出异常.
- 遇到中断
如下的代码展示了wait的基本用法
- 研究代码的执行顺序. 执行顺序为 , 主线程中, 首先启动了线程1 ,并且调用了sleep , 保证线程1的优先执行, 线程1 进入了同步代码块中之后, 调用了
object.wait();
方法, 进入了阻塞的状态. 由于调用了object.wait();
, 那么也释放了synchronized (object)
锁, 因此线程2 获得锁, 线程2 执行后, 调用了object.notify();
, 唤醒了线程1, 线程1 重新的获得了锁, 打印了获得锁的语句. - 证明wait释放了锁 在上面的分析执行步骤中, 也可以看到由于线程1 调用了
object.wait();
方法, 释放了锁, 因此证明了wait方法释放了锁.
package com.thread.threadobjectclasscommonmethods;
/**
* 类名称:Wait
* 类描述: 展示wait的基本用法
* 1. 研究代码的执行顺序
* 2. 证明wait释放了锁
*
* @author: https://javaweixin6.blog.csdn.net/
* 创建时间:2020/8/29 15:06
* Version 1.0
*/
public class Wait {
// 锁对象
public static final Object object = new Object();
static class Thread1 extends Thread{
@Override
public void run() {
synchronized (object) {
System.out.println("线程 "+ Thread.currentThread().getName() + "syn代码块中, 开始执行 ");
try {
//调用wait , 释放锁.
object.wait();
} catch (InterruptedException e) {
//在执行等待期间, 如果遇到中断了, 就会抛出 InterruptedException
e.printStackTrace();
}
//重新获取锁
System.out.println("线程 "+ Thread.currentThread().getName() + " 获取到了锁 ");
}
}
}
static class Thread2 extends Thread {
@Override
public void run() {
synchronized (object) {
//线程1 释放了锁, 线程 2 因此能进入此同步代码块.
//调用notify的前提是要有线程处于wait状态. 因此要保证线程1 先执行 .
object.notify();
System.out.println("线程 "+ Thread.currentThread().getName() + " 调用了notify ");
}
}
}
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
Thread2 thread2 = new Thread2();
thread1.start();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread2.start();
}
}
控制台打印如下 . 打印的内容与分析的执行顺序相同 .