Object类中wait代餐方法和notifyAll方法

package com.yang.Test.ThreadStudy;

import lombok.SneakyThrows;

/**
* 进入到TimeWaiting(计时等待)有两种方式
* 1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
* 2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态
* 唤醒的方法
* void notify()唤醒在此对象监视器上等待的单个线程
* void notifyAll()唤醒在此对象监视器上等待的所有线程
*/
public class WaitAndNotify {
public static void main(String[] args) {
//创建锁对象保证唯一
Object obj = new Object();
//创建一个顾客线程(消费者)
new Thread(){
@SneakyThrows
@Override
public void run() {
//一直等着吃包子
while(true){
//保证等到和唤醒只能有一个在执行
synchronized (obj){
System.out.println("顾客1告知拉板要的包子的种类和数量");
//调用wait方法,放弃cpu的执行,进入WAIYING状态(无限等待)
obj.wait();
}
//唤醒之后执行的代码
System.out.println("包子已经做好了,顾客1开吃!");
}
}
}.start(); new Thread(){
@SneakyThrows
@Override
public void run() {
//一直等着吃包子
while(true){
//保证等到和唤醒只能有一个在执行
synchronized (obj){
System.out.println("顾客2告知拉板要的包子的种类和数量");
//调用wait方法,放弃cpu的执行,进入WAIYING状态(无限等待)
obj.wait();
}
//唤醒之后执行的代码
System.out.println("包子已经做好了,顾客2开吃!");
}
}
}.start(); //创建一个老板线程(生产者)
new Thread(){
@SneakyThrows
@Override
public void run() {
//一直做
while(true){
//花了5秒做包子
Thread.sleep(5000);
//保证等到和唤醒只能有一个在执行
synchronized (obj){
System.out.println("老板5秒钟之后做好包子,告知顾客可以吃包子了");
//做好包子之后,调用notify方法,唤醒顾客吃包子
obj.notify(); }
}
}
}.start(); new Thread(){
@SneakyThrows
@Override
public void run() {
//一直做
while(true){
//花了5秒做包子
Thread.sleep(5000);
//保证等到和唤醒只能有一个在执行
synchronized (obj){
System.out.println("老板2,5秒钟之后做好包子,告知顾客可以吃包子了");
//做好包子之后,调用notify方法,唤醒顾客吃包子
obj.notifyAll(); }
}
}
}.start();
}
}

运行结果:

线程间通信

概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。

比如:线程A用来生产包子,线程b用来吃包子,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题

为什么要处理线程通信:

多个线程并发执行的时候,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行,那么多线程之间需要一些协调通信,依次来帮我们达到多线程共同操作一份数据

最新文章

  1. Spring(三)__aop编程
  2. 浏览器css bug及bug解决方法
  3. windows下Gulp安装
  4. [BS] 小知识点总结-03
  5. ROS程序编辑器
  6. jps命令
  7. java多线程什么时候释放锁—wait()、notify()
  8. android 获取屏幕尺寸
  9. JAVA GUI学习 - 窗体背景图片设置方法:重写paintComponent(Graphics g)方法
  10. 九度OJ 1035:找出直系亲属(二叉树)
  11. OpenH264
  12. 对于单页应用中如何监听 URL 变化的思考
  13. Python绘制wav文件音频图(静态)[matplotlib/wave]
  14. pip更新到18版本后使用pycharm更新问题:module 'pip' has no attribute 'main'
  15. SpringBoot整合MyBatis(注解版)
  16. html标签之Object标签详解
  17. Codeforces 791B. Bear and Friendship Condition 联通快 完全图
  18. 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
  19. 依赖注入(一)构造函数注入(PHP)
  20. JAVA-JSP动作元素之param

热门文章

  1. .NET性能优化-使用ValueStringBuilder拼接字符串
  2. drools session理解
  3. SpringBoot实现基于token的登录验证
  4. 关于基础RMQ——ST算法
  5. CF1682E Unordered Swaps
  6. java基础题(4)
  7. Centos免密登陆
  8. 【生成对抗网络学习 其三】BiGAN论文阅读笔记及其原理理解
  9. vue-cli在webpack环境下怎样生成开发环境模板(适合初学者)
  10. Vue数据双向绑定原理(vue2向vue3的过渡)