• 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()之后的代码块。



  • 相关阅读:
    543. Diameter of Binary Tree
    1519. Number of Nodes in the Sub-Tree With the Same Label
    WinCMD CMDKEY
    Delphi TDataSet
    Delphi DBGrid 实现多选和获取多选的值
    Access 错误: Data type mismatch in criteria expression
    Delphi Timage 介绍和操作[1](图片判断、清空、类型)
    Delphi WinAPI CopyFile、CopyFileEx、CopyFileTransacted -复制文件
    Delphi 图片转换(jpg、bitmap、png、gif)
    WinCMD NET USE 命令
  • 原文地址:https://www.cnblogs.com/liyanbofly/p/15877983.html
Copyright © 2020-2023  润新知