JavaSE-多线程(12)- wait notify

JavaSE多线程 编写一个类,直接继承java. lang. Thread,重写run方法。 阅读详情

JavaSE-多线程(12)- wait notify

程序中有一个容器,现需要实现如下内容:
线程1实现向容器添加10个元素,线程2实现元素个数监控,当添加到第5个元素时,线程2给出提示并结束

实现方式1

import java.util.ArrayList;
import java.util.List;

/**
 * 线程1实现向容器添加10个元素,线程2实现元素个数监控,当添加到第5个元素时,线程2给出提示并结束
 */
public class VolatileTest3 {

    //保证线程可见性,t1线程更改容器数据时,保证t2线程拿到最新容器容量
    private volatile List<String> list = new ArrayList<String>();

    public synchronized void add(String str) {
        list.add(str);
    }

    public synchronized int size() {
        return list.size();
    }

    public static void main(String[] args) {
        VolatileTest3 volatileTest3 = new VolatileTest3();
        Thread t1 = new Thread(() -> {
            for (int i = 1; i <= 10; i++) {
                System.out.println("add " + i + " start ");
                /*try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/
                volatileTest3.add("str" + i);
                System.out.println("add " + i + " end ");
            }
        });
        t1.start();

        Thread t2 = new Thread(() -> {
            while (true) {
                System.out.println("volatileTest3.size():" + volatileTest3.size());
                if (volatileTest3.size() == 5) {
                    System.out.println("i=5 end");
                    break;
                }
            }
        });
        t2.start();
    }
}

输出结果

add 1 start 
add 1 end 
add 2 start 
add 2 end 
add 3 start 
add 3 end 
add 4 start 
add 4 end 
add 5 start 
add 5 end 
volatileTest3.size():5
add 6 start 
i=5 end
add 6 end 
add 7 start 
add 7 end 
add 8 start 
add 8 end 
add 9 start 
add 9 end 
add 10 start 
add 10 end 

实现方式2

import java.util.ArrayList;
import java.util.List;

/**
 * 线程1实现向容器添加10个元素,线程2实现元素个数监控,当添加到第5个元素时,线程2给出提示并结束
 */
public class WaitNotifyTest {

    //保证线程可见性,t1线程更改容器数据时,保证t2线程拿到最新容器容量
    private List<String> list = new ArrayList<String>();

    public void add(String str) {
        list.add(str);
    }

    public int size() {
        return list.size();
    }

    public static void main(String[] args) {
        VolatileTest3 volatileTest3 = new VolatileTest3();
        Object lock = new Object();

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("t2 线程开始");
                if (volatileTest3.size() != 5) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("i=5 end");
                //通知t1执行
                lock.notify();
                System.out.println("t2 线程结束");
            }
        });
        t2.start();

        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("t1 线程开始");
                for (int i = 1; i <= 10; i++) {
                    System.out.println("add " + i + " start ");
                    volatileTest3.add("str" + i);
                    System.out.println("add " + i + " end ");
                    if (i == 5) {
                        //通知t2执行
                        lock.notify();
                        try {
                            /**
                             * 这一句不能少,因为notify不会立即释放锁,需要等synchronized方法体执行完才释放锁,
                             * 而wait会释放锁,所以t2线程才可以继续执行wait后的代码
                             */
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                System.out.println("t1 线程结束");
            }

        });
        t1.start();

    }
}

运行结果:

t2 线程开始
t1 线程开始
add 1 start 
add 1 end 
add 2 start 
add 2 end 
add 3 start 
add 3 end 
add 4 start 
add 4 end 
add 5 start 
add 5 end 
i=5 end
t2 线程结束
add 6 start 
add 6 end 
add 7 start 
add 7 end 
add 8 start 
add 8 end 
add 9 start 
add 9 end 
add 10 start 
add 10 end 
t1 线程结束
构建Java线程间的默契:学习wait()、notify()和notifyAll()方法的巧妙运用 在Java多线程编程中,线程间的同步和通信是非常重要的。本文将帮助读者学习wait()、notify()和notifyAll()方法的巧妙运用,实现线程间的默契配合,构建高效的多线程应用。本文将全面解析wait()、notify()和notifyAll()方法在Java中的使用。通过深入源代码解析、实际应用场景案例、优缺点分析、类代码方法介绍和具体的Java代码测试用例,帮助读者全面掌握线程间的默契配合。在线程间实现默契配合是多线程编程中的关键问题。 阅读详情

相关推荐

普源精电DHO系列示波器选购指南:从学生党到工程师的完整对比

本文深入评测普源精电DHO系列示波器,从DHO800到DHO4000各型号的核心参数、功能特点及适用场景进行全面对比,帮助学生党和工程师根据实际需求选择最佳型号。重点分析带宽、采样率、存储深度等关键指标,并提供实用的选购建议和进阶使用技巧,帮助用户充分发挥示波器性能。

weixin_30485379的博客 167

【JavaSE】【多线程】volatile,wait/notify

volatile处理内存可见性问题 wait / notify调控线程调度

yj20040627的博客 3508

从分立到集成:深入解析Buck电路的核心模块与设计权衡

本文深入解析Buck电路的核心模块与设计权衡,从分立到集成方案的优缺点对比。详细探讨Buck电路的高效能量转换、小型化设计及灵活电压调节能力,并结合实际案例分享分立方案中的PWM生成、反馈环路设计及保护电路优化经验,为工程师提供实用设计参考。

weixin_29306317的博客 224

Java 多线程之线程间的通信——wait及notify方法

线程间的相互作用   线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务。   Object类中相关的方法有两个notify方法和三个wait方法:   http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html   因为wait和notify方法定义在Object类中,因此会被所有的类所继承。

风雨同行 5336

【openEuler容器镜像部署指南】

【代码】【List集合排序 】

weixin_43878094的博客 1112

ShengBTE热导计算:利用ShengBTE计算热导显示NAN的原因是什么?算出的热导不随平均声子自由程变化

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 964

多线程-wait、notify、sleep

复习: 1.实现多线程的方法到底有1种还是2种还是4种? 2.怎样才是正确的线程启动方式? 3.如何正确停止线程?(难点) 4.线程的一生-6个状态(生命周期) 学习目标: 1.为什么线程通信的方法wait(),notify()和notifyAll()被定义在Object类?而sleep定义在Thread类里? 2.用3种方式实现生产者模式 3.JavaSE8和Java1.8和JDK 8 是什么关系,是同一个东西吗? 4.Join 和sleep和wait期间线程的状态分别是什么?为什么

FiveCode的博客 261

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3661

JavaSE 多线程——wait、notify与生产者与消费者模式

Java自我学习路线一、简单概述二、wait()1. wait()和Thread.sleep()的比较三、notify()四、生产者和消费者模式 一、简单概述 在Java中,任何一个Java对象都有wait和notify方法,wait和notify方法不是线程对象的方法,不通过线程对象调用 wait与notify是本地方法,并且被 final 修饰,无法被重写,建立在synchronized线程同步的基础上 二、wait() 调用某个对象的wait() 方法能让当前线程处于等待状态,并将当前线程置入锁

Lv Zejiang 433

常用元器件使用方法13:物理层接口芯片DP83848的使用方法

介绍: DP83848是以太网物理层接口芯片,具有多种型号,从便于焊接角度考虑LQFP-48封装较为合适,采用LQFP-48封装的芯片,有2种型号,分别为DP83848I和DP83848C,如下图所示。 其主要区别是使用温度不同,如下图所示。 这2种芯片芯片网上均有销售,按理说DP83848C价格应该更加便宜,实际不然,DP83848I的价格低于DP83848C,考虑或与芯片的出货量...

snmplink的博客 1万+

Spark中Application、Job、Stage和Task区别详解

在Spark中,有一些关键的概念,如Application、Job、Stage和Task,它们描述了Spark作业的不同层次和组成部分。下面我将详细介绍每个概念,并通过示例说明它们之间的区别。

优快云 精品推荐 904

JavaSE后阶(多线程)

Java多线程

2401_85776998的博客 1078

linux平台Modbus TCP测试

【代码】linux平台Modbus TCP测试。

无线互联&网络介绍 818

JavaSE基础——关于Object类中的wait 和 notify方法

1、wait 和 notify 不是线程对象的方法,而是Java中任何一个对象都有的方法。 2、wait 和 notify 方法的作用: wait:让正在活动在该对象上的线程进入等待状态,无限期等待,直到被唤醒为止 notify:让正在该对象上等待的线程被唤醒 notifyAll():唤醒所有等待的线程 3、使用 wait 和 notify 方法,要建立在线程同步的基础上,wait 会让活动在当前对象的线程进入等待状态,并且释放占有对象的 "锁" 。 4、通过一个实例来熟悉wait 和 no

YZG ' BLOG 3005

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java多线程 wait(),notify(),notifyAll()

多线程中的常见方法 面试中的常见问题 为什么线程通信的方法wait(),notify(),和notifyAll()被定义在Object类中,sleep定义在Thread类里? 用3种方法实现生产者模式 JavaSE8和Java1.8和JDK8是什么关系,是同一个东西吗? join,sleep和wait期间线程的状态分别是什么,为什么? Thread与Object中与多线程常见的方法 Thre...

anying5823的博客 228

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JavaSE第一百零三讲:wait及notify方法全名、深度剖析

上一讲内容中,我们讲到了synchronized的两种使用方法,以及它们之间的区别,其实synchronized的使用功能其实是存在问题的,比如说有一个很复杂的耗时的操作,而且它涉及到一个并发性的问题,所以只能使用synchronized关键字让每次一个线程去访问,此时如果有一个线程进入操作,耗时了很长时间,而其他的线程都在等待,这样就会导致等待队列中的越后面的线程等待时间越长,这对用户来说显然是

AHuier_Techblog :如果我不在写代码,你就 @me 1165

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

javaSE 线程等待/唤醒, wait(), notify()

Demo.java:package cn.xxx.demo; /* * 开启输入线程和输出线程,实现赋值和打印值。 同步synchronized可以保证赋值的年龄和姓名是对应的。 wait/notify可以保证赋值和输出是交替进行的。 */ public class Demo{ public static void main(String[] args) { Resour...

houyanhua1的专栏 227

【java】线程间通信之wait和notify

本文转载自:Java 多线程(七) 线程间的通信——wait及notify方法 1. 线程间通信   一些场景下,需要多个线程之间协调通信,来共同完成一件任务。java中Object类中相关的方法有两个notify方法和三个wait方法:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html。因为wait和notify方法定...

XYZ 504

Javase | 多线程

多线程: 1.程序 2.进程 3.线程 4.多线程 5.自定义线程类 : 5.1 继承Thread类 5.2 实现Runnable接口 6.多线程的生命周期及状态转换 新建状态 (New) 就绪状态 (Runnable) 运行状态 (Running) 阻塞状态 (Blocked) 死亡状态 (Terminated) 7.多线程的调度 线程的优先级 线程的休眠 线程的让步 yield() 和 sleep() 的区别 8.多线程同步和通信 8.1 多线程的同步 8.2 多线程通信 .....

m0_70720417的博客 1691

Java SE 103 wait及notify方法全面、深度解读

Java SE 103 wait及notify方法全面深度解读 1.java 并发包 (1)从jdk1.5开始,给我们引入了并发相关的类与接口,java.util.concurrent包下有一些关于并发处理的类。用并发包下面的类可以很好的解决synchronized方法或代码块中等待代码执行时间过长等等并发问题。 2.线程的同步 (1)当synchronized方法执行完或发生异常时,会自动释放锁。 (2)被synchronized保护的数据应该是私有的(private) (1)这个图增加了线程同步的,

青风百草 319

Java并发编程之Object.wait()/notify()

场景: 占个坑!!!

AwayFuture的博客 342

javaSE学习笔记

JavSE笔记 编者的话 ​ 这个笔记是本人在重新学习javaSE后,大部分是在bilibili动力结点杜老师的视频上学习,本笔记中大量引用整合了其中的笔记,截图,代码等等非常感谢,感觉收获颇多,但是收获的知识点又太过分散,且担心忘记这些来之不易的精华,特做此总结,因为是个人笔记,难免会有一些这样那样的问题,如果读者发现错误或者影响到您正常的知识架构,望正在读此的您见谅! ​ ————————tyong–汤勇 文章目录JavSE笔记编者的话数组须知优点和

m0_49039508的博客 707

JavaSE学习——wait和notify方法

wait和sleep不同的是,sleep是线程Thread的一个方法,而wait属于对象方法且会使得当前持有锁的线程释放锁并进入等待状态。notify的作用是随机唤醒一个正在等待的线程(注意唤醒之后的线程不是直接运行,而是还需要重新抢占资源/锁才可以继续运行)Object对象还有三个方法,分别是wait/notify/notifyAll,它们是用来让线程之间相互通信、协作的:一个线程等着,另一个线程通知它可以继续跑了。System.out.println("线程1:我被唤醒了");// 等待 + 释放锁。

m0_62993594的博客 29

JavaSE——多线程

多线程 一、多线程概述 进程与线程 进程是一个应用程序(1个进程是一个软件)。 线程是一个进程中的执行场景/执行单元。 一个进程可以启动多个线程。 对于java程序来说,当在DOS命令窗口中输入:java HelloWorld 回车之后。会先启动JVM,而JVM就是一个进程。JVM再启动一个主线程调用main方法。同时再启动一个垃圾回收线程负责看护,回收垃圾。最起码,现在的java程序中至少有两个线程并发,一个是垃圾回收线程,一个是执行main方法的主线程。 进程和线程的关系 进程可以看做是现实

weixin_56341892的博客 491

Java 多线程——— 线程间的通信(wait及notify方法)

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992我们一起学Java! 线程间的相互作用   线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务。...

chuifuhuo6864的博客 99

javaSE之多线程

Java多线程 *首先线程是由CPU调度的 1实现多线程的两种方法 *继承Thread类 *实现Runable接口 2线程常用的控制方法 *wait()方法使线程等待进入阻塞状态,使用notify()/notifyAll方法将其唤醒,是由对象调度的 *sleep()方法使线程进入阻塞状态,由线程调度的 *join()方法使线程进入阻塞状态,由线程调度的(调用此方法主线程将会被阻塞,直到调用此方法的...

qq_42964601的博客 193
上一篇: JavaSE-多线程(11)- LockSupport
下一篇: JavaSE-多线程(2.1)- 锁举例1(synchronized)
sql2008help
博客等级 码龄11年 80粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值