多线程笔记(十):wait()/notify()/notifyAll() 的用法

wait()方法:

       该方法用来使得当前线程进入等待状态,直到接到通知或者被中断打断为止。

       在调用 wait() 方法之前,线程必须要获得该对象的对象级锁;换句话说就是该方法只能在同步方法或者同步块中调用,如果没有持有合适的锁的话,线程将会抛出异常 IllegalArgumentException。调用 wait() 方法之后,当前线程则释放锁。

notify()方法:

       该方法用来唤醒等待池中处于等待状态的一个线程。

       如果有多个线程则线程规划器任意选出一个线程进行唤醒,使其去竞争获取对象锁,但线程并不会马上就释放该对象锁, wait() 所在的线程也不能马上获取该对象锁,要程序退出同步块或者同步方法之后,当前线程才会释放锁,wait() 所在的线程才可以获取该对象锁。

notifyAll()方法:

       该方法用来唤醒等待池中处于等待状态的所有线程。同 notify()方法


相同点/不同点:

   相同点:

        wait()、notify()、notifyAll()方法属于Object中的方法;对于Object中的方法,每个对象都拥有。

   不同点:

        wait()方法是释放锁的;notify()、notifyAll()方法不释放锁,必须等到所在线程把代码执行完。


实例

/**
 * TODO 等待线程01
 *
 * @author liuzebiao
 * @Date 2019-12-24 9:36
 */
public class WaitThread01 implements Runnable {

    //定义一把对象锁
    private Object lock;

    public WaitThread01(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock){
            System.out.println("开始执行:wait01()");
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("执行结束:wait01()");
        }
    }
}
/**
 * TODO 等待线程02
 *
 * @author liuzebiao
 * @Date 2019-12-24 9:36
 */
public class WaitThread02 implements Runnable {

    //定义一把对象锁
    private Object lock;

    public WaitThread02(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock){
            System.out.println("开始执行02:wait()");
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("执行结束02:wait()");
        }
    }
}
/**
 * TODO 唤醒线程 notify()/notifyAll()
 *
 * @author liuzebiao
 * @Date 2019-12-24 9:36
 */
public class NotifyThread implements Runnable {

    private Object lock;

    public NotifyThread(Object lock) {
        this.lock = lock;
    }

    @Override
    public void run() {
        synchronized (lock){
            System.out.println("开始执行:notify()");
            lock.notify();
            //lock.notifyAll();
            System.out.println("执行结束:notify()");
        }
    }
}
/**
 * TODO 测试
 *
 * @author liuzebiao
 * @Date 2019-12-24 9:36
 */
public class Demo02 {

    public static void main(String[] args) {
        //定义一把锁
        Object lock = new Object();
        //三个线程使用同一把锁(对象锁)(lock)
        //等待线程01
        Thread waitThread01 = new Thread(new WaitThread01(lock));
        waitThread01.start();
        //等待线程02
        //Thread waitThread02 = new Thread(new WaitThread02(lock));
        //waitThread02.start();
        //唤醒线程
        Thread notifyThread = new Thread(new NotifyThread(lock));
        notifyThread.start();

    }
}

 测试结果:

开始执行:wait01()
开始执行:notify()
执行结束:notify()
执行结束:wait01()

 结果分析:

        我们可以看出:wait()方法会释放锁、 notify() 方法不会释放锁。

        等到 NotifyThread() 线程所有方法执行完成才会释放锁,此时 WaitThread() 线程才会再次获得锁。

        notifyAll() 方法同 notify() ,可以自行测试。


wait()/notify()/notifyAll()  的用法,介绍到此为止

如果本文对你有所帮助,那就给我点个赞呗 ^_^ 

End

发布了247 篇原创文章 · 获赞 44 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/lzb348110175/article/details/103677160