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 security认证两类用户代码实例

    下面是详细讲解“Spring security认证两类用户代码实例”的完整攻略。 1. Spring Security认证两类用户 Spring Security可以认证两类用户:前台用户和后台用户。在实际开发中,这两类用户需要分别进行认证,才能保证系统的安全性。 1.1 前台用户 前台用户是指普通用户,通常需要进行注册、登录等操作。Spring Secur…

    Java 2023年5月20日
    00
  • sql文件怎么打开,SQL格式是什么文件?

    SQL(Structured Query Language)是一种专为管理关系数据库管理系统(RDBMS)而创建的语言。SQL文件是SQL语句的文本文件,由SQL语句组成,通常保存为.sql文件扩展名。 要打开SQL文件,可以使用文本编辑器,也可以使用专门的数据库管理软件(如MySQL Workbench、Navicat等)。在文本编辑器中打开SQL文件,可…

    Java 2023年6月16日
    00
  • Java Stream流的常见生成和操作方法总结

    Java Stream流的常见生成和操作方法总结 生成Stream流的常见方式 1. 通过Collection接口生成 可以通过Collection接口提供的stream()和parallelStream()方法生成一个Stream或ParallelStream流: List<String> list = Arrays.asList("…

    Java 2023年5月26日
    00
  • 一篇文章带你入门Java运算符

    一篇文章带你入门Java运算符 运算符是编程语言中非常重要的基础知识之一,Java作为一门主流的编程语言也是如此。在这篇文章中,我们将详细讲解Java中的各种运算符,带你入门Java运算符。本文主要内容如下: 基础概念介绍 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 基础概念介绍 在学习Java运算符之前,我们需要先了解一些基础概念。Java中…

    Java 2023年5月23日
    00
  • Spring中@Transactional用法详细介绍

    我来为您详细讲解Spring中@Transactional用法的攻略。 Spring中@Transactional用法详细介绍 一、什么是@Transactional @EnableTransactionManagement注解:开启事务管理器。 @Transactional注解:在类或方法上标记该业务需要事务管理。 二、@Transactional的常用属…

    Java 2023年5月20日
    00
  • Struts2 的国际化实现方式示例

    下面将结合代码示例详细讲解 Struts2 的国际化实现方式。 一、国际化实现的基本原理 Struts2 的国际化实现是通过多资源包机制来实现的。在一个 web 应用程序中,我们可以定义多个资源包,每个资源包对应不同的语言/国家 locale,当系统的 locale 和资源包的 locale 匹配时,Struts2 会自动使用该 locale 对应的资源文件…

    Java 2023年5月20日
    00
  • ajax提交session超时跳转页面使用全局的方法来处理

    下面我将详细讲解“ajax提交session超时跳转页面使用全局的方法来处理”的攻略: 1. 为什么需要处理session超时问题? 在网站应用中,为了提高用户体验和保护用户数据安全,通常需要对用户进行登录鉴权,登录成功后保留用户信息,而服务器端的Session就是一个将用户信息和服务器端的数据进行关联的机制。但是Session都有一个生命周期,当这个生命周…

    Java 2023年6月16日
    00
  • Java实现的简单网页截屏功能示例

    关于如何实现Java实现的简单网页截屏功能的攻略,我可以提供以下详细步骤: 准备工作 安装Java环境以及Java相关IDE,如Eclipse等。 安装Selenium Webdriver相关的浏览器驱动文件,如ChromeDriver等。 实现步骤 导入相关的jar包,如selenium-java等,并创建一个Java项目。 在项目中导入Selenium的…

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