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

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

相关文章

  • SpringMVC之AbstractAnnotationConfigDispatcherSer解读

    SpringMVC之AbstractAnnotationConfigDispatcherSer解读

    这篇文章主要介绍了SpringMVC之AbstractAnnotationConfigDispatcherSer,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Java字节码指令集的使用详细

    Java字节码指令集的使用详细

    本篇文章对Java字节码指令集的使用进行了详细的介绍。需要的朋友参考下
    2013-05-05
  • Java利用Map实现计算文本中字符个数

    Java利用Map实现计算文本中字符个数

    这篇文章主要为大家详细介绍了Java如何利用Map集合实现计算文本中字符个数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    java线程池ThreadPoolExecutor的八种拒绝策略示例详解

    ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有大小,当池子体积不够承载时,就涉及到拒绝策略。JDK中已预设了 4 种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景以及还能扩展哪些拒绝策略
    2021-11-11
  • Json在Struts中的转换与传递方法

    Json在Struts中的转换与传递方法

    下面小编就为大家带来一篇Json在Struts中的转换与传递方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • java注解的类型知识点总结

    java注解的类型知识点总结

    在本篇文章里小编给大家整理了一篇关于java注解的类型知识点总结内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • 解决接口调用报错newSocketStream(..)failed:Too many open files问题

    解决接口调用报错newSocketStream(..)failed:Too many open files问题

    这篇文章主要介绍了解决接口调用报错newSocketStream(..)failed:Too many open files问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java中的Fork/Join框架使用详解

    Java中的Fork/Join框架使用详解

    这篇文章主要介绍了Java中的Fork/Join框架使用详解,Fork/Join 框架:就是在必要的情况下,将一个大任务,进行<BR>拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个<BR>的小任务运算的结果进行 join 汇总,需要的朋友可以参考下
    2024-01-01
  • 基于Java实现互联网实时聊天系统(附源码)

    基于Java实现互联网实时聊天系统(附源码)

    Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。本文将利用它实现互联网实时聊天系统,感兴趣的可以了解一下
    2022-09-09
  • JAVA 实现磁盘文件加解密操作的示例代码

    JAVA 实现磁盘文件加解密操作的示例代码

    这篇文章主要介绍了JAVA 实现磁盘文件加解密操作的示例代码,帮助大家利用Java实现文件的加解密,感兴趣的朋友可以了解下
    2020-09-09

最新评论