如何使用Latch代替wait notify来进行通知
发表于:2024-11-16 作者:千家信息网编辑
千家信息网最后更新 2024年11月16日,这篇文章将为大家详细讲解有关如何使用Latch代替wait notify来进行通知,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。/** * 曾经的面试
千家信息网最后更新 2024年11月16日如何使用Latch代替wait notify来进行通知
这篇文章将为大家详细讲解有关如何使用Latch代替wait notify来进行通知,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
/** * 曾经的面试题:(淘宝?) * 实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束 * * 给lists添加volatile之后,t2能够接到通知,但是,t2线程的死循环很浪费cpu,如果不用死循环,该怎么做呢? * * 这里使用wait和notify做到,wait会释放锁,而notify不会释放锁 * 需要注意的是,运用这种方法,必须要保证t2先执行,也就是首先让t2监听才可以 * * 阅读下面的程序,并分析输出结果 * 可以读到输出结果并不是size=5时t2退出,而是t1结束时t2才接收到通知而退出 * 想想这是为什么? * * notify之后,t1必须释放锁,t2退出后,也必须notify,通知t1继续执行 * 整个通信过程比较繁琐 * * 使用Latch(门闩)替代wait notify来进行通知 * 好处是通信方式简单,同时也可以指定等待时间 * 使用await和countdown方法替代wait和notify * CountDownLatch不涉及锁定,当count的值为零时当前线程继续运行 * 当不涉及同步,只是涉及线程通信的时候,用synchronized + wait/notify就显得太重了 * 这时应该考虑countdownlatch/cyclicbarrier/semaphore * @author mashibing */package yxxy.c_019;import java.util.ArrayList;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;public class MyContainer5 { // 添加volatile,使t2能够得到通知 volatile List lists = new ArrayList(); public void add(Object o) { lists.add(o); } public int size() { return lists.size(); } public static void main(String[] args) { MyContainer5 c = new MyContainer5(); //门闩(当这个1变成0的时候,这个门闩就开了) CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { System.out.println("t2启动"); if (c.size() != 5) { try { //门闩等待不需要锁定任何对象 latch.await(); //也可以指定等待时间 //latch.await(5000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("t2 结束"); }, "t2").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e1) { e1.printStackTrace(); } new Thread(() -> { System.out.println("t1启动"); for (int i = 0; i < 10; i++) { c.add(new Object()); System.out.println("add " + i); if (c.size() == 5) { // 打开门闩,让t2得以执行 latch.countDown(); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1").start(); }}
关于如何使用Latch代替wait notify来进行通知就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
线程
门闩
方法
通信
两个
个数
元素
内容
容器
文章
时候
时间
更多
知识
篇文章
结果
循环
输出
不错
繁琐
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全主要学的是什么
达摩团战是软件开发吗
村级开展网络安全教育活动
linux日常服务器巡检脚本
查询数据库表是否存在
外文数据库需要多少钱
洞窝软件开发
sql数据库建立新表
3d全屋设计软件开发
游戏服务器备份时会断网吗
河南软件开发二本学校有哪些
网络安全书签简笔
做网站服务器可以自己做吗
启动网络安全应急预案
闵行区项目软件开发信息推荐
数据库技术包含哪些
服务器电源多少瓦在哪看
我的世界服务器速通挑战
福州大学 专利数据库
甘肃软件开发
国美网络技术有限公司
ora数据库两张表合并
我与网络安全作文100字
小微直销软件开发公司
云南电信软件开发专业
南京华为软件开发工资待遇
软件开发生成文件
软件开发咨询取费
分发网络安全知识宣传手册活动
忍三为什么要等服务器开启