【线程】——等待集(wait,notify,notifyAll)
对象中的等待集(wait,notify,notifyAll)
- 我们知道线程是的操作是抢占式执行的,我们假想有多个线程在等待一个cpu给提供资源,但是其中线程x抢cpu抢的快,但是当前cpu并没有那个可以给x提供的资源,又因为这个x不停的抢cpu,导致其他线程不能进入到cpu中,因此会影响到程序的运行效率。
为了解决这个问题,我们引入了对象等待集,也就是wait,notify,notifyAll三个关键字,要和synchronized一起用
- wait 如果cpu中没有满足这个线程执行的资源时候,让这个线程等待,wait()会使线程状态发生变化(runnable–>waiting,waiting–>runnable)
- 等的是对像的等待集上(wait()是Object的一个方法,所以等在该对象的等待集上)
- 使用的时候必须加锁,等在哪个对象上,就对哪个对象加锁(wait()执行成功时会释放锁,醒来时会重新请求锁)
- notify 当cpu中的条件成熟的时候,通知指定的线程工作,唤醒一个线程
- notifyAll 是一个唤醒所有线程,让这些线程去竞争一把锁
- 哪个线程调用wait(),哪个线程进入等待集
举例分析
那么这种情况如何解决呢?
那就是该线程发现条件还没有成熟(也就是发现ATM机没钱的时候),就应该释放锁,并且等待,知道其他线程通知说条件已经成熟了,然后把该线程唤醒(也就是运钞扯来了,并且把钱放进ATM机了,或者是后面的人进去存钱,存好了之后跟他说我刚刚存钱了,你可以进去取钱了)
关键在于需要根据实际情况来手动控制线程之间的先后顺序。(虽然线程的执行顺序是由调度器实现的,但是有时候要控制先后顺序的hi后就需要手动实现)——这就引出了等待集
等待集的核心操作主要有两个
1.等待(wait方法)
2.通知(notify方法)
如
notify用法
import java.util.Scanner;public class ThreadDemo12 {private static Object object = new Object();public static class MyThread extends Thread{@Overridepublic void run() {synchronized (object){try {object.wait();} catch (InterruptedException e) {e.printStackTrace();}}for (int i = 10; i < 20; i++) {System.out.println(i);}}}public static void main(String[] args){Thread thread = new MyThread();thread.start();Scanner scanner = new Scanner(System.in);System.out.println("我不输入,Thread线程就不会运行");scanner.nextInt();synchronized (object){object.notify();}}
}
注意
调用wait的前提是发现当前操作的条件不满足,要想知道条件满不满足,就需要先能够访问到资源(先获取到锁)
wait必须在同步代码块中才能使用,否则就会出现异常
wait方式做了三件事:
1.先释放锁(前提是已经获取到锁)
2.等待通知(等待其他线程调用notify方法,把它唤醒)
3.收到通知后会重新尝试获取锁
从内核角度分析
竞态条件问题:
wait:
1.释放锁
2.等待通知
3.获取锁
因为wait的前两步都是原子性操作,所有wait不存在竞态条件问题
wait 和 sleep 的对比
理论上:wait 和 sleep 是没有可比性的,wait()用于线程之间的通信的,sleep()使线程阻塞一段时间。
相同点:都可以让线程放弃执行一段时间。
- wait 之前需要请求锁,而wait执行时会先释放锁,等被唤醒时再重新请求锁。这个锁是 wait 对像上的 monitor
lock - sleep 是无视锁的存在的,即之前请求的锁不会释放,没有锁也不会请求。
- wait 是 Object 的方法
- sleep 是 Thread 的静态方法
【线程】——等待集(wait,notify,notifyAll)相关推荐
- java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()
1. wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前 ...
- java线程同步(synchronized,wait,notify,notifyAll)
synchronized: 包括synchronized方法和synchronized块. synchronized方法使用this作为默认的"同步监视器",而synchroniz ...
- 【并发编程】线程等待、通知(wait/notify)
了解了在 Java 中如何启动一个线程,并且学习了 Thread 类的 API 以及线程的状态和锁的概念后,接下来我们学习一下线程之间的等待和通知,也就是wait/notify.我们首先思考一个问题, ...
- 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )
1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...
- JAVA线程间协作:wait.notify.notifyAll
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- java notify 指定_java的notify/notifyAll:如何notify指定的线程?
我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait.noitify.notifyAll做并发控制. 当生产者生产完毕后,如何只notify消费者呢? 你确保只有消费者 ...
- java并发编程(十)使用wait/notify/notifyAll实现线程间通信
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait() thr ...
- java线程的生命周期及wait(),notify(),notifyAll()的详解分析
1.java线程的生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread) 当创建Thread类的一个实例(对象)时, ...
- 线程方法notify/notifyAll源码分析
众所周知,使用notify/notifyAll方法能唤醒wait等待的线程,那么在底层源码究竟做了些什么呢? 本章内容要解决的问题 问题1:notify/nofityAll真的唤醒了线程吗? 问题2: ...
最新文章
- Only fullscreen opaque activities can request orientation
- 19 条 MySQL 技巧,效率至少提高 3倍!
- Win8离线添加Net Framework 3.5功能
- TP5 验证码功能实现(解决点击验证码不更新的问题)
- 调试九法:软硬件错误的排查之道书评
- 介绍了如何取成员函数的地址以及调用该地址
- 把应用程序从 Internet Explorer 迁移到 Mozilla
- SQL Server和Oracle数据库索引介绍
- 如何在windows xp下实现声音内录
- 6.27java斗地主
- 苹果Mac更新系统版本失败如何解决?
- python获取域名对应的ip_Python实现通过解析域名获取ip地址的方法分析
- csp是什么比赛_CSP-J/S认证 NOIP、NOI信息学竞赛解读!
- 《重构》——第二次阅读笔记。golang视角
- 25 | 业务安全体系:对比基础安全,业务安全有哪些不同?
- K3实现按虚拟件/组件发料
- 论文笔记:Revisiting Temporal Modeling for Video Super-resolution(重新审视视频超分辨率的时间建模) Part1 系咁嘅啦
- scrapy 爬取链家二手房数据
- C#Task执行线程及其相关问题
- java实现上位机与下位机串口通信
热门文章
- flask response对象
- 五子棋c语言算杀算法,c语言 五子棋危险判断 求大神解释啊
- python抓取网页电话号码_利用正则表达式编写python 爬虫,抓取网页电话号码!...
- 块存储性能--阿里云ECS磁盘
- VVOL和VASA Provider
- vSAN其实很简单-什么!vSAN主机启动慢?
- python读写excel模块pandas_如何用python pandas操作excel?
- C++中的字符串输入输出函数详解
- 学以致用三十四-----python2.0加载图片
- iOS 开发之几个 Demo 分享网站