Java object wait notify notifyAll代码解析

Java中的wait、notify和notifyAll方法是线程之间通信的关键。wait方法用于使调用线程等待,直到另一个线程调用该对象的notify或notifyAll方法。notify方法唤醒其他线程来竞争当前线程,而notifyAll方法唤醒所有等待该对象锁的线程,以便他们可以继续竞争。

下面是一些使用wait、notify和notifyAll的示例:

示例1:基本的wait和notify方法演示

public class WaitNotifyDemo {
    private Object lock = new Object();

    public void waitMethod() {
        synchronized (lock) {
            try {
                System.out.println("等待锁的线程开始等待...");
                lock.wait();
                System.out.println("线程已经被唤醒...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void notifyMethod() {
        synchronized (lock) {
            System.out.println("通知等待锁的线程...");
            lock.notifyAll();
        }
    }

    public static void main(String[] args) {
        WaitNotifyDemo demo = new WaitNotifyDemo();

        Thread t1 = new Thread(() -> {
            demo.waitMethod();
        });

        Thread t2 = new Thread(() -> {
            demo.notifyMethod();
        });

        t1.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
    }
}

这个示例演示了两个线程之间的通信。线程t1在synchronized块中执行wait方法导致它等待。线程t2在2秒钟后调用notifyAll方法唤醒线程t1。

示例2:使用notifyAll方法

public class WaitNotifyAllDemo {
    private Object lock = new Object();
    private List<String> list = new ArrayList<>();

    public void add() {
        synchronized (lock) {
            list.add("item");
            // 通知所有线程,当前集合已经新增了一个元素
            lock.notifyAll();
        }
    }

    public void remove() {
        synchronized (lock) {
            if (list.isEmpty()) {
                try {
                    // 如果列表为空,线程等待
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 从列表中移除第一个元素
            list.remove(0);
            System.out.println("移除一个元素...");
        }
    }

    public static void main(String[] args) {
        WaitNotifyAllDemo demo = new WaitNotifyAllDemo();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                demo.add();
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                demo.remove();
            }
        });

        t1.start();
        t2.start();
    }
}

这个示例演示了在一个多线程环境下添加和移除元素的过程。线程t1负责添加元素,线程t2负责移除元素。如果列表为空,线程t2会等待直到线程t1添加一个元素并通知它。注意,这里使用了notifyAll方法,因为可能有多个线程等待列表中新元素的出现,notifyAll能保证通知到所有等待线程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java object wait notify notifyAll代码解析 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Spring Boot之内嵌tomcat版本升级操作示例

    Spring Boot之内嵌Tomcat版本升级操作示例 Spring Boot是一个快速开发、便于部署的Java Web框架,它内嵌了Tomcat作为默认的Web容器。本文将介绍如何将Spring Boot内嵌的Tomcat版本升级,帮助开发者更好地使用和优化Spring Boot应用程序。 升级步骤 第一步:查看当前Tomcat版本 首先需要查看当前Sp…

    Java 2023年6月2日
    00
  • 浅析springboot通过面向接口编程对控制反转IOC的理解

    我来为你讲解“浅析Spring Boot通过面向接口编程对控制反转IOC的理解”的完整攻略。 什么是面向接口编程? 面向接口编程是一种开发方式,它将依赖关系从实现类转移到了接口上。实现类不再是主导者,而是被接口所引用。这样可以提高代码的可维护性,降低了类与类之间的耦合度。 什么是控制反转IOC? 控制反转IOC(Inversion of Control)是指…

    Java 2023年5月31日
    00
  • java打印出菱形图案实例详解

    Java 打印出菱形图案实例详解 简介 本文讲解如何在 Java 中打印出菱形图案。 思路分析 要打印出菱形图案,需要先了解菱形的形状。以一个边长为 5 的菱形为例,其形状如下: * *** ***** *** * 菱形由五行组成,分别为: 第一行:一个空格,一个星号 第二行:两个空格,三个星号 第三行:三个空格,五个星号 第四行:两个空格,三个星号 第五行…

    Java 2023年5月26日
    00
  • SpringMVC下获取验证码实例详解

    下面我将为您详细讲解“SpringMVC下获取验证码实例详解”的完整攻略。该攻略主要分为三个部分,分别是:前端页面、后端控制器和验证码生成工具。 前端页面 首先,我们需要在前端页面中添加验证码输入框和验证码图片。具体代码如下: <!DOCTYPE html> <html> <head> <meta charset=&…

    Java 2023年6月15日
    00
  • Spring MVC 自定义数据转换器的思路案例详解

    Spring MVC 自定义数据转换器的思路案例详解 Spring MVC 是一个非常流行的 Java Web 框架,它提供了很多便捷的功能,其中包括数据转换器。数据转换器可以将请求参数转换为 Java 对象,或将 Java 对象转换为响应参数。Spring MVC 默认提供了很多数据转换器,但有时候我们需要自定义数据转换器来满足特定的需求。本文将详细讲解 …

    Java 2023年5月18日
    00
  • SpringBoot多数据库连接(mysql+oracle)的实现

    下面就是“SpringBoot多数据库连接(mysql+oracle)的实现”的完整攻略。 一、依赖引入 首先在pom.xml中引入mysql和oracle的jdbc依赖,以及SpringBoot的相关依赖: <dependencies> <!– mysql jdbc –> <dependency> <group…

    Java 2023年5月20日
    00
  • 详解Spring与MyBatis的整合的方法

    当我们需要将Spring和MyBatis结合在一起使用时,可以采用以下步骤来实现: 1. 项目搭建 首先我们需要搭建一个Spring项目,可以使用Spring Boot或者Spring MVC。如果使用Spring Boot,则可以选择自动配置MyBatis的starter,这样无需手动配置MyBatis。如果使用Spring MVC,则需要手动配置MyBa…

    Java 2023年5月19日
    00
  • IDEA项目使用SpringBoot+MyBatis-Plus的方法

    这里是详细的讲解“IDEA项目使用SpringBoot+MyBatis-Plus的方法”的完整攻略,包含了两条示例。 准备条件 为了完成本攻略,你需要事先准备以下条件: JDK 8及以上版本 IntelliJ IDEA 2020.3或以上版本 Maven 3.0及以上版本 SpringBoot 2.4.x版本 MyBatis-Plus 3.x版本 数据库(本…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部