Java object wait notify notifyAll代码解析

 更新时间:2020年11月18日 10:09:29   作者:dint  
这篇文章主要介绍了Java object wait notify notifyAll代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

测试代码:

public static Object loc=new Object();

  public static void main(String[] args) throws Exception{

    Thread t1=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
          System.out.println("["+sdf.format(new Date())+"] t1___等待锁...");
          synchronized (loc) {
            System.out.println("["+sdf.format(new Date())+"] t1___获得锁 ...");
            Thread.sleep(5000);
            System.out.println("["+sdf.format(new Date())+"] t1___loc..开始执行wait...");
            loc.wait();
            System.out.println("["+sdf.format(new Date())+"] t1___loc..执行wait后续...");
            Thread.sleep(1000);
          }
          System.out.println("["+sdf.format(new Date())+"] t1___loc..离开锁...");
        }catch (Exception e){
          e.printStackTrace();
        }
      }
    });
    Thread t3=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
          System.out.println("["+sdf.format(new Date())+"] t3___等待锁...");
          synchronized (loc) {
            System.out.println("["+sdf.format(new Date())+"] t3___进入锁...");
            Thread.sleep(5000);
            System.out.println("["+sdf.format(new Date())+"] t3___loc..开始 wait...");
            loc.wait();
            System.out.println("["+sdf.format(new Date())+"] t3___loc..执行 wait后续...");
            Thread.sleep(1000);
          }
          System.out.println("["+sdf.format(new Date())+"] t3___离开锁...");
        }catch (Exception e){
          e.printStackTrace();
        }
      }
    });

    Thread t2=new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          java.text.SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss SSS");
          System.out.println("["+sdf.format(new Date())+"] t2___等待锁...");
          synchronized (loc) {
            System.out.println("["+sdf.format(new Date())+"] t2___获得锁...");
            Thread.sleep(5000);
            System.out.println("["+sdf.format(new Date())+"] t2___loc..开始执行 notify...");
            loc.notify();
            System.out.println("["+sdf.format(new Date())+"] t2___loc..执行 notify后续...");
            Thread.sleep(1000);
          }
          System.out.println("["+sdf.format(new Date())+"] t2___loc 离开锁....");
        }catch (Exception e){
          e.printStackTrace();
        }
      }
    });
    t1.start();
    t3.start();
    Thread.sleep(500);
    t2.start();


    System.out.println("t1___before join ....");
    t1.join();
    System.out.println("t2___before join ....");
    t2.join();
    System.out.println("t3____before join ....");
    t3.join();
    System.out.println("main exit....");
  }

执行结果:

[16:55:59 384] t1___等待锁...

[16:55:59 384] t1___获得锁 ...

[16:55:59 384] t3___等待锁...
t1___before join ....
[16:55:59 836] t2___等待锁...
[16:56:04 392] t1___loc..开始执行wait...

[16:56:04 392] t2___获得锁...
[16:56:09 392] t2___loc..开始执行 notify...
[16:56:09 392] t2___loc..执行 notify后续...
[16:56:10 392] t2___loc 离开锁....


[16:56:10 392] t3___进入锁...
[16:56:15 392] t3___loc..开始 wait...
[16:56:15 392] t1___loc..执行wait后续...
[16:56:16 392] t1___loc..离开锁...
t2___before join ....
t3____before join ....

总结:

1. 执行wait后‘'暂时‘ 释放当前对象锁给其他线程,当前线程处于等待状态

2. syn块中的wait收到notify通知后 唤醒cpu 继续判断锁状态

3. 执行notify且当前的对象锁释放后 wait等待的线程激活

4. notifyAll 是一次唤醒所有的wait

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Cloud Ubuntu环境部署的步骤与注意事项

    Spring Cloud Ubuntu环境部署的步骤与注意事项

    这篇文章主要给大家介绍了关于Spring Cloud Ubuntu环境部署的步骤与注意事项,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Cloud具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • Springmvc nginx实现动静分离过程详解

    Springmvc nginx实现动静分离过程详解

    这篇文章主要介绍了Springmvc nginx实现动静分离过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java读取TXT文件内容的方法

    Java读取TXT文件内容的方法

    本篇文章主要介绍了Java读取TXT文件内容的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot实现返回值数据脱敏的步骤详解

    SpringBoot实现返回值数据脱敏的步骤详解

    这篇文章主要给大家介绍一下SpringBoot实现返回值数据脱敏的步骤,文章通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • 在Java中实现堆排序的步骤详解

    在Java中实现堆排序的步骤详解

    堆排序是一种基于堆数据结构的排序算法,堆是一种特殊的完全二叉树,堆排序利用堆的性质通过一系列操作将数组元素按升序或降序排列,本文给大家介绍了如何在Java中实现堆排序,需要的朋友可以参考下
    2024-12-12
  • MyBatis实现插入大量数据方法详解

    MyBatis实现插入大量数据方法详解

    最近在公司项目开发中遇到批量数据插入或者更新,下面这篇文章主要给大家介绍了关于MyBatis实现批量插入的相关资料,需要的朋友可以参考下
    2022-11-11
  • Java IO模型之BIO、NIO、AIO三种常见IO模型解析

    Java IO模型之BIO、NIO、AIO三种常见IO模型解析

    这篇文章主要介绍了今天我们来聊Java IO模型,BIO、NIO、AIO三种常见IO模型,我们从应用调用的过程中来分析一下整个IO的执行过程,不过在此之前,我们需要简单的了解一下整个操作系统的空间布局,需要的朋友可以参考下
    2024-07-07
  • Java 蒙特卡洛算法求圆周率近似值实例详解

    Java 蒙特卡洛算法求圆周率近似值实例详解

    这篇文章主要介绍了蒙特卡洛算法的起源,特点,以及Java编程中利用蒙特卡洛算法计算圆周率近似值的实例,需要的朋友可以参考下
    2017-09-09
  • SpringBoot3整合Swagger3时出现Type javax.servlet.http.H的ttpServletRequest not present错误解决方法

    SpringBoot3整合Swagger3时出现Type javax.servlet.http.H的ttpSe

    这篇文章主要介绍了SpringBoot3整合Swagger3时出现Type javax.servlet.http.H的ttpServletRequest not present错误解决方法,文中有详细的解决方法,需要的朋友可以参考下
    2025-01-01
  • Spring Boot整合ELK实现日志采集与监控

    Spring Boot整合ELK实现日志采集与监控

    这篇文章主要介绍了Spring Boot整合ELK实现日志采集与监控,需要的朋友可以参考下
    2022-06-06

最新评论