关于wait/notify以及顺序打印

2023-11-03

1.等待和唤醒是同一个对象
2.notify只会唤醒一个线程


使用角度
1.Object.wait() 会抛出 InterruptedException
2.调用object.wait() 必须首先对object(monitor lock) 进行加锁

class Main{
    private static Object object = new Object();
    private static class AThread extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("A 在扫地");
            }
            try {
                synchronized (object) {
                    object.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 10; i++) {
                System.out.println("A 正在擦桌子");
            }
        }
    }

    public static void main(String[] args) {
        Thread aThread = new AThread();
        aThread.start();

        Scanner scanner = new Scanner(System.in);
        System.out.println("随便输入什么,A去擦桌子");
        scanner.nextLine();
        synchronized (object){
            object.notify();
        }
    }
}

sync(object){
object.wait
}
调用到wait 释放锁,进入waiting状态,从等待集出来只会,还会再加一次锁(请求锁)


注意事项:

  1. 必须先加锁,才能调用wait
  2. wait和notify必须是同一对象
  3. wait会释放锁(等待在哪个对象上,释放哪个锁)
  4. wait返回之前,需要再次加锁
  5. notify只会唤醒一个,并且是随机
  6. notifyAll会唤醒所有的
  7. wait和notify之间的时序很重要

顺序打印

public class PrintInOrder {
    private  static  int i = 0;

    public synchronized void first() throws InterruptedException {
        if (i == 0) {
            System.out.println("One");
            i = 1;
            notifyAll();
        }
        wait();
    }
    public  synchronized void second() throws InterruptedException {
        if (i == 1) {
            System.out.println("two");
            i = 2;
            notifyAll();
        }
        wait();
    }
    public  synchronized void third() throws InterruptedException {
        if (i == 2) {
            System.out.println("three");
            i = 0;
            notifyAll();
        }
        wait();
    }
    private static class printOne extends Thread{
        PrintInOrder object;

        public printOne(PrintInOrder object) {
            this.object = object;
        }

        @Override
        public void run() {
            while (true){
                try {
                    object.first();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private static class PrintTwo extends Thread{
        PrintInOrder object;

        public PrintTwo(PrintInOrder object) {
            this.object = object;
        }

        @Override
        public void run() {
            while (true){
                try {
                    object.second();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private static class PrintThree extends Thread{
        PrintInOrder object;

        public PrintThree(PrintInOrder object) {
            this.object = object;
        }

        @Override
        public void run() {
            while (true){
                try {
                    object.third();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        PrintInOrder object = new PrintInOrder();
        Thread t1 = new printOne(object);
        t1.start();
        Thread t2 = new PrintTwo(object);
        t2.start();
        Thread t3 = new PrintThree(object);
        t3.start();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于wait/notify以及顺序打印 的相关文章

  • Spring Boot Actuator未授权访问漏洞利用

    目录 一 前言 二 端点描述 三 漏洞发现 四 漏洞利用 五 安全措施 六 安全建议 一 前言 Actuator 是 Spring Boot 提供的服务监控和管理中间件 当 Spring Boot 应用程序运行时 它会自动将多个端点注册到路
  • 知识分享系统

    开发工具 eclipse idea vscode等 数据库 sqlite mysql sqlserver等 功能模块 请用文字描述 至少200字
  • 使用idea创建java web项目

    创建web项目有很多方法 就说一个最简单的方法吧 创建一个java项目 点击创建 右击项目选择添加框架支持 勾选上web应用程序 点击确定 再点击当前文件 编辑配置 点击加号 选择Tomcat服务器 本地 也可以选择其他服务器 点击配置 选
  • Servlet与Jsp之间有哪些数据传输的方式?

    前言 根据MVC架构大家都很清楚 servlet充当咱们mvc中的c 也就是controller 而jsp则是咱们的view 所以呀 根据它们各自的职责划分 servlet相当于是一个指挥官 将页面数据交给业务逻辑层去处理 处理后的数据也就
  • servlet传json数据给前端

    重点 1 json数据的发送 后 2 json数据的提取 前 例如 servlet返回从session提取的当前用户信息给前端使用 1 前端不带数据发送axios给后端请求数据 用get axios method get url http
  • JavaWeb——JavaWeb核心之Servlet

    一 Servlet简介 1 什么是Servlet Servlet 运行在服务端的Java小程序 是sun公司提供一套规范 接口 用来处理客户端请求 响应给浏览器的动态资源 但servlet的实质就是java代码 通过java的API 动态的
  • 设计模式之六大原则

    设计模式之六大原则 转载 关于设计模式的六大设计原则的资料网上很多 但是很多地方解释地都太过于笼统化 我也找了很多资料来看 发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂 因此转载过来 原作者博客链接 http blog cs
  • brew install mysql

    Mac安装MySQL Brew 以及修改默认密码 折腾了一大圈之后 得知需要安装MacOS的包管理器 HomeBrew 百度搜索macos安装homebrew 进入第一个CSDN大佬文章开始撸 安装HomeBrew教程 跟着教程把brew安
  • JSP、JSTL标签

  • errcode = 40163; errmsg = "code been used"(提供一种解决思路)

    最近在做微信开发 就在开发完毕测试的时候 遇到一个大问题 每次新用户进入的时候就报错 错误基本上就是code been used 我去百度了好久 没有找到合适的方案 后来我仔细的看了一下微信开发文档 终于解决了 注 该方法不一定对所有人有效
  • javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint

    java 验证出现如下错误 javax validation UnexpectedTypeException HV000030 No validator could be found for constraint 错误原因 Java实体类中
  • 理解Servlet和Servlet容器、Web服务器等概念

    转载自http blog csdn net iAm333 之前在开源中国看到一篇文章 初学 Java Web 开发 请远离各种框架 从 Servlet 开发 觉得很不错 想到自己之前一直对各种框架执迷不悟 顿感惭愧 于是 看了孙鑫的 Ser
  • spring的jdbcTemplate批量添加数据,单条数据中文正常,多数据第二条数据开始中文乱码

    今天用spring的jdbcTemplate org springframework jdbc core JdbcTemplate 批量添加数据 方法是jdbcTemplate bathUpdate 然后遇到一个很神奇的问题 批量添加的数据
  • 互联网 API 接口幂等性设计

    WEB 资源或 API 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概念 对超时处理 系
  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • javaweb——Response下载文件

    HttpServletResponse web服务器接收到客户端的http请求 针对这个请求分别创建一个代表请求的HttpServletResponse对象 一个代表响应的HttpServletResponse对象 如果要获取客户端请求过来
  • 解决Jenkins插件不能下载安装的问题

    安装到这一步 显示无法下载Jenkins插件 安装中升级站点 如果你还在安装过程中 遇见这个问题 你可以打开一个新的网页 输入网址http localhost 8080 pluginManager advanced 在最下面的升级站点 把其
  • Spring容器和应用上下文理解

    有了Spring之后 通过依赖注入的方式 我们的业务代码不用自己管理关联对象的生命周期 业务代码只需要按照业务本身的流程 走啊走啊 走到哪里 需要另外的对象来协助了 就给Spring说 我想要个对象 于是Spring就很贴心的给你个对象 听
  • JDK 8 List集合使用记录

    JDK8 的新特性给我们开发带来了很大的便利性 先声明 我没有系统的去学习 JDK8的这些所有新特性 本文只是记录一些我个人日常开发中常遇到的一些 JDK8 的新特性方法 1 提取对象集合中的某一属性集合 List lt 对象 gt gt
  • JavaWeb的高级、Listener监听器--Servlet事件

    一 学习目标 1 Listener监听器 2 Listener监听器作用 3 Listener监听器的创建与销毁 二 重点知识 1 Listener监听器 Filter和Listener是Servlet规范中的两个高级特性 不同于Servl

随机推荐