notify和wait
public class ListAdd2 {private volatile static List list = new ArrayList(); public void add(){list.add("bjsxt");}public int size(){return list.size();}public static void main(String[] args) {final ListAdd2 list2 = new ListAdd2();// 1 实例化出来一个 lock// 当使用wait 和 notify 的时候 , 一定要配合着synchronized关键字去使用final Object lock = new Object();Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {synchronized (lock) {for(int i = 0; i <10; i++){list2.add();System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");Thread.sleep(500);if(list2.size() == 5){System.out.println("已经发出通知..");lock.notify();}} }} catch (InterruptedException e) {e.printStackTrace();}}}, "t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {synchronized (lock) {if(list2.size() != 5){try {System.out.println("t2进入...");lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");}}}, "t2"); t2.start();t1.start();}}
输出结果
t2进入...
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..
可以看出来wait方法会让出锁的使用权,而notify不会让出来
现在引入了CountDownLatch方法
CountDownLatch是通过“共享锁”实现的。在创建CountDownLatch中时,会传递一个int类型参数count,该参数是“锁计数器”的初始状态,表示该“共享锁”最多能被count线程同时获取。当某线程调用该CountDownLatch对象的await()方法时,该线程会等待“共享锁”可用时,才能获取“共享锁”进而继续运行。而“共享锁”可用的条件,就是“锁计数器”的值为0!而“锁计数器”的初始值为count,每当一个线程调用该CountDownLatch对象的countDown()方法时,才将“锁计数器”-1;通过这种方式,必须有count个线程调用countDown()之后,“锁计数器”才为0,而前面提到的等待线程才能继续运行!
CountDownLatch的两个主要方法
// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
void await()
// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
void countDown()
package heihei;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/*** wait notfiy 方法,wait释放锁,notfiy不释放锁* @author alienware**/
public class ListAdd2 {private volatile static List list = new ArrayList(); public void add(){list.add("bjsxt");}public int size(){return list.size();}public static void main(String[] args) {final ListAdd2 list2 = new ListAdd2();final CountDownLatch countDownLatch = new CountDownLatch(1);Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {try {for(int i = 0; i <10; i++){list2.add();System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");Thread.sleep(500);if(list2.size() == 5){System.out.println("已经发出通知..");countDownLatch.countDown();}} } catch (InterruptedException e) {e.printStackTrace();}}}, "t1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {//synchronized (lock) {if(list2.size() != 5){try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止..");throw new RuntimeException();}}, "t2"); t2.start();t1.start();}}
这样做的话输出结果是
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
已经发出通知..
当前线程:t1添加了一个元素..
当前线程:t2收到通知线程停止..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
当前线程:t1添加了一个元素..
顺序正确
notify和wait相关推荐
- 用实例揭示notify()和notifyAll()的本质区别
用实例揭示notify()和notifyAll()的本质区别 收藏 notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notifyA ...
- java notify 的作用_java 为什么notify和notifyAll都不起作用?
叮当猫咪 每个线程初始化的时候都是 c=new C(),锁住的是不同的对象.class Example{ public static void main(String arr[]){ ...
- lua java 性能比较_Lua coroutine vs Java wait/notify
在上文Lua coroutine 不一样的多线程编程思路中想到coroutine的运行机制跟Java中的wait/notify很相似,所以写了一个简单程序比较一下. 源代码 Lua code co = ...
- java wait abc_java----wait/notify
解释 wait/notify必须配合synchronized使用 demo class NotifyStop2 { private final Object lock = new Object(); ...
- JAVA多线程之Synchronized、wait、notify实例讲解
一.Synchronized synchronized中文解释是同步,那么什么是同步呢,解释就是程序中用于控制不同线程间操作发生相对顺序的机制,通俗来讲就是2点,第一要有多线程,第二当多个线程同时竞争 ...
- java 线程交互_java 线程交互之wait/notify
众所周知java支持多线程,有多线程就必然会存在多线程的交互,交互方式有多种,比如通过共享数据,或者通过提供的锁信号量等等,这里通过用wait以及notify实现线程交互. 要用好线程的wait和no ...
- 解决THINKPHP 支付宝接口异步notify 无效可能的问题。
2019独角兽企业重金招聘Python工程师标准>>> 支付成功后,发现alipayReturn 正常~ AlipayNotify 怎么搞都不正常,好像支付宝就是不能POST过来. ...
- java线程wait_java多线程学习(四) 之 wait和notify
ynchronized让线程之间互斥,但是有时候因为业务逻辑,需要主动释放锁,让其它的线程执行,这就需要线程之间通信,我们知道JAVA里每个对象都有个隐式锁,JAVA为每个对象都提供了wait和not ...
- java线程-保护性暂停(wait,notify实现)
考虑以下场景需求: A同学计算一个结果res B同学需要等待A同学的结果res 需要用到保护性暂停:一个线程等待另外一个线程的执行结果 这里我们让A,B同学关联到一个类. B同学一直等待A同学 imp ...
- Java中的等待/通知机制(wait/notify)
为什么80%的码农都做不了架构师?>>> 当一个线程修改了一个对象的值,另外一个线程需要感知到这个变化,并且做出相应的操作时,可以使用Java中的等待/通知机制去实现这个功能. ...
最新文章
- 理解 IntelliJ IDEA 的项目配置和Web部署
- 纪念乔帮主-Jobes的生平视频
- verdi使用linux命令,verdi工具的使用
- golang中的strings.HasPrefix
- activepython win32com_activepython下载
- android进程间通信:使用AIDL
- 【计算机图形学】实验:C#语言采用GDI+定义笔刷并填充图形完整实验操作流程
- 58到家为2000万家庭提供上门生活服务的背后是云计算的高效支撑
- 电话号码正则表达式 (包含电话号码 和 手机号码)
- jQuery.access的作用
- (转)以太坊(Ethereum ETH)是如何计算难度的
- Node.js简介与架构
- 基于jQuery的响应式网站视频插件FitVids.js
- 2021-09-11
- 奥卡姆剃刀定律(Occam‘s Razor)
- 微信硬件开发系列教程04-新浪云服务器搭建(airkiss/airsync)
- Storage of multidimensional arrays based on arbitrary tiling
- OpenCV每日函数 几何图像变换模块 (9) resize函数
- 【python】matplotlib.pyplot介绍
- Springboot+vue+java幼儿园管理系统
热门文章
- 详解Windows内存分页机制
- MySQL中B-tree索引和Hash索引区别
- 今天才知道,MySQL 的 binlog 编号可以这么大!
- 深度阅读之《Concurrency in Go》
- @你最强资源包来了 MobTech 联合 LiveVideoStack 发起劳动光荣榜
- LiveVideoStack线上交流分享 (十) —— 开源声码器WORLD在语音合成中的应用
- LiveVideoStack线上交流分享 ( 三 ) —— 实时视频通信质量评价及寻找视频质量甜点的方法...
- 腾讯研发效率领先的秘密:高效率的工具
- linux下mysql安装
- 联邦学习:保护用户数据隐私