对象中的等待集(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()使线程阻塞一段时间。

相同点:都可以让线程放弃执行一段时间。

  1. wait 之前需要请求锁,而wait执行时会先释放锁,等被唤醒时再重新请求锁。这个锁是 wait 对像上的 monitor
    lock
  2. sleep 是无视锁的存在的,即之前请求的锁不会释放,没有锁也不会请求。
  3. wait 是 Object 的方法
  4. sleep 是 Thread 的静态方法

【线程】——等待集(wait,notify,notifyAll)相关推荐

  1. java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()

    1. wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前 ...

  2. java线程同步(synchronized,wait,notify,notifyAll)

    synchronized: 包括synchronized方法和synchronized块. synchronized方法使用this作为默认的"同步监视器",而synchroniz ...

  3. 【并发编程】线程等待、通知(wait/notify)

    了解了在 Java 中如何启动一个线程,并且学习了 Thread 类的 API 以及线程的状态和锁的概念后,接下来我们学习一下线程之间的等待和通知,也就是wait/notify.我们首先思考一个问题, ...

  4. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )

    1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...

  5. JAVA线程间协作:wait.notify.notifyAll

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  6. java notify 指定_java的notify/notifyAll:如何notify指定的线程?

    我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait.noitify.notifyAll做并发控制. 当生产者生产完毕后,如何只notify消费者呢? 你确保只有消费者 ...

  7. java并发编程(十)使用wait/notify/notifyAll实现线程间通信

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait()  thr ...

  8. java线程的生命周期及wait(),notify(),notifyAll()的详解分析

    1.java线程的生命周期     线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread)     当创建Thread类的一个实例(对象)时, ...

  9. 线程方法notify/notifyAll源码分析

    众所周知,使用notify/notifyAll方法能唤醒wait等待的线程,那么在底层源码究竟做了些什么呢? 本章内容要解决的问题 问题1:notify/nofityAll真的唤醒了线程吗? 问题2: ...

最新文章

  1. Only fullscreen opaque activities can request orientation
  2. 19 条 MySQL 技巧,效率至少提高 3倍!
  3. Win8离线添加Net Framework 3.5功能
  4. TP5 验证码功能实现(解决点击验证码不更新的问题)
  5. 调试九法:软硬件错误的排查之道书评
  6. 介绍了如何取成员函数的地址以及调用该地址
  7. 把应用程序从 Internet Explorer 迁移到 Mozilla
  8. SQL Server和Oracle数据库索引介绍
  9. 如何在windows xp下实现声音内录
  10. 6.27java斗地主
  11. 苹果Mac更新系统版本失败如何解决?
  12. python获取域名对应的ip_Python实现通过解析域名获取ip地址的方法分析
  13. csp是什么比赛_CSP-J/S认证 NOIP、NOI信息学竞赛解读!
  14. 《重构》——第二次阅读笔记。golang视角
  15. 25 | 业务安全体系:对比基础安全,业务安全有哪些不同?
  16. K3实现按虚拟件/组件发料
  17. 论文笔记:Revisiting Temporal Modeling for Video Super-resolution(重新审视视频超分辨率的时间建模) Part1 系咁嘅啦
  18. scrapy 爬取链家二手房数据
  19. C#Task执行线程及其相关问题
  20. java实现上位机与下位机串口通信

热门文章

  1. flask response对象
  2. 五子棋c语言算杀算法,c语言 五子棋危险判断 求大神解释啊
  3. python抓取网页电话号码_利用正则表达式编写python 爬虫,抓取网页电话号码!...
  4. 块存储性能--阿里云ECS磁盘
  5. VVOL和VASA Provider
  6. vSAN其实很简单-什么!vSAN主机启动慢?
  7. python读写excel模块pandas_如何用python pandas操作excel?
  8. C++中的字符串输入输出函数详解
  9. 学以致用三十四-----python2.0加载图片
  10. iOS 开发之几个 Demo 分享网站