wait 和notify/notifyall 应用简要说明

一、 wait和notify 方法
  Object lockWait=new Object();  lockWait.wait()或lockWait.notity 必须是在同步代码块,及有锁的代码块中并且 wait(),对象必须是被锁对象;
  lockWait.wait(); 阻塞线程停止执行;  lockWait.notify() 唤醒线程开始执行,
 
  1、由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。
      当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。
  2、notify 和 notifyAll的区别
     notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程
     ,选择哪个线程取决于操作系统对多线程管理的实现。notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。
     如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll 方法。比如在生产者-消费者里面的使用,每次都需要唤醒所有的消费者或是生产者,以判断程序是否可以继续往下执行。
/**
 * Object lockWait=new Object();  lockWait.wait()或lockWait.notity 必须是在同步代码块,及有锁的代码块中并且 wait(),对象必须是被锁对象
 * lockWait.wait(); 阻塞线程停止执行;  lockWait.notify() 唤醒线程开始执行,
 *
 * 1、由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。
 *     当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。
 * 2、notify 和 notifyAll的区别
 *    notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程
 *    ,选择哪个线程取决于操作系统对多线程管理的实现。notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。
 *    如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll 方法。比如在生产者-消费者里面的使用,每次都需要唤醒所有的消费者或是生产者,以判断程序是否可以继续往下执行。
 * 3、
 *
 *
 */
public class ObjectLockWaitService {

    // 控制 等待和执行 及(wait和notify)
    Object lockWait=new Object();

    public  void  method01(){
        synchronized(lockWait){
            try {
                System.out.println("put 待待处理业务前!,"+Thread.currentThread().getName());
                lockWait.wait();
                System.out.println("put 我被放行,执行了!,"+Thread.currentThread().getName());
                Thread.sleep(1000);
                lockWait.notify();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }



    public   void  method02(){
        synchronized(lockWait){
            try {
                lockWait.notify();
                Thread.sleep(1000);
                System.out.println("get 待待处理业务前!!,"+Thread.currentThread().getName());
                lockWait.wait();
                System.out.println("get 我被放行,执行了!!,"+Thread.currentThread().getName());

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

二、调用实例方法

public class UseObjectWaitService {
    /**
     * 调用 wait和notify 方法
     * @param args
     */
    public static void main(String[] args) {
        Object mainLock=new Object();
        ObjectLockWaitService lockWaitService=new ObjectLockWaitService();
        Thread th1=new Thread(()->{
            lockWaitService.method01();
        },"thread-1");
        th1.start();

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Thread th2=new Thread(()->{
            lockWaitService.method02();
        },"thread-2");
        th2.start();

        try {
            th2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("我是主线程");

    }

}

 th2.join:解释一下,是主线程等待子线程的终止。也就是说主线程的代码块中,如果碰到了 th2.join()方法,此时主线程需要等待(阻塞),等待子线程结束了(Waits for this thread to die.),才能继续执行 th2.join()之后的代码块。



posted @ 2022-02-10 10:11  xiaoBai1001  阅读(101)  评论(0编辑  收藏  举报