notifyAll方法:

进入到Timed_Waiting(计时等待)状态有两种方式:

1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态

2.使用wait(long m)方法,wait方法如果在毫秒结束之后,还没有被notify,就会自动醒来,进入到Runnable或BLocked状态。(区别:直接wait无参,是进入waiting无限等待状态,有参是进入Timed_Waiting限时等待状态中)
  

唤醒方法,也一共有两个方法:

1.notify方法唤醒在此对象监视器上等待的单个线程

2.notifyAll方法唤醒在此对象监视器上等待的所有线程

public static void main(String[] args) {
// 创建锁对象,保证唯一
Object obj = new Object(); // 创建一个顾客线程
// 使用匿名内部类,这样就不用写继承父类的子类,或实现接口的实现类
new Thread(new Runnable() {
@Override
public void run() {
// 保证等待和唤醒只能有一个在执行
// 所以需要使用同步代码块
while (true) { // 死循环
synchronized (obj) {
// 告知老板需要的包子种类和数量
System.out.println("顾客1告知老板需要的包子种类和数量");
// 调用监视器锁的wait方法,进入waiting状态
try { // 捕捉异常
// 5000毫秒之后,无notify唤醒,自动醒
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 唤醒之后的操作
System.out.println("包子做好了,顾客1开吃!");
System.out.println("------------");
}
}
}
}).start(); // 执行 // 创建第二个顾客线程
new Thread(new Runnable() {
@Override
public void run() {
// 保证等待和唤醒只能有一个在执行
// 所以需要使用同步代码块
while (true) { // 死循环
synchronized (obj) {
// 告知老板需要的包子种类和数量
System.out.println("顾客2告知老板需要的包子种类和数量");
// 调用监视器锁的wait方法,进入waiting状态
try { // 捕捉异常
// 5000毫秒之后,无notify唤醒,自动醒
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 唤醒之后的操作
System.out.println("包子做好了,顾客2开吃!");
System.out.println("------------");
}
}
}
}).start(); // 执行 // 创建一个老板线程(生产者)
new Thread(new Runnable() {
@Override
public void run() {
// 同步代码块
while (true) {
// 唤醒顾客,吃包子
try {
// 花5秒做包子
Thread.sleep(5000L); // long型
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println("5秒到了。包子做好了!");
obj.notify(); // 如果有多个线程在等待,随机唤醒一个
obj.notifyAll(); // 唤醒所有等待线程,方便同步!
}
}
}
}).start();
}

线程间的通信

概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同
比如∶线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题

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

如何保证线程间通信有效利用资源︰
多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作

就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能有效的利用资源。而这种手段即—―等待唤醒机制

Object类中wait带参方法和notifyAll方法和线程间通信的更多相关文章

  1. Object类中wait代餐方法和notifyAll方法和线程间通信

    Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...

  2. java线程学习之notify方法和notifyAll方法

    notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...

  3. Android中Looper的quit方法和quitSafely方法

    Looper是通过调用loop方法驱动着消息循环的进行: 从MessageQueue中堵塞式地取出一个消息.然后让Handler处理该消息,周而复始.loop方法是个死循环方法. 那怎样终止消息循环呢 ...

  4. 关于Object类的equals方法和hashCode方法

    关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为tr ...

  5. equals()方法和hashCode()方法详解

    equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...

  6. sleep()方法和wait()方法的区别? sleep()方法和yield()方法的区别?

    sleep()方法和wait()方法的区别? sleep方法是Thread的静态方法,wait方法是Object类的普通方法 sleep方法不释放同步锁,wait方法释放同步锁(执行notify方法唤 ...

  7. flush方法和close方法的区别

    package com.yhqtv.demo05.Writer; import java.io.FileWriter; /* * @author XMKJ yhqtv.com Email:yhqtv@ ...

  8. 线程间通信(等待,唤醒)&Java中sleep()和wait()比较

    1.什么是线程间通信? 多个线程在处理同一资源,但是任务却不同. 生活中栗子:有一堆煤,有2辆车往里面送煤,有2辆车往外拉煤,这个煤就是同一资源,送煤和拉煤就是任务不同. 2.等待/唤醒机制. 涉及的 ...

  9. Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题

    Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...

随机推荐

  1. error: 'xxxxxx' does not have a commit checked out

    今天完成了毕业设计的主要功能,想上传到Git上给朋友看一下.以前也没用过git,看了一下视频,现学现卖了就是. 在使用git add命令时提示error: 'xxxxxx' does not have ...

  2. windows 安装 kalfka 并快速启动

    1.安装Java 环境 https://www.java.com/zh_CN/ 直接下载安装即可 (如果之前有配置过java环境 可以先跳过此步骤,但是如果运行的时候报错就需要把之前的jdk环境变量删 ...

  3. HashMap源码理解一下?

    HashMap 是一个散列桶(本质是数组+链表),散列桶就是数据结构里面的散列表,每个数组元素是一个Node节点,该节点又链接着多个节点形成一个链表,故一个数组元素 = 一个链表,利用了数组线性查找和 ...

  4. [AcWing 68] 0到n-1中缺失的数字

    点击查看代码 class Solution { public: int getMissingNumber(vector<int>& nums) { if (nums.empty() ...

  5. 干货 | 一文彻底读懂nginx中的location指令

    一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 一文带你读懂Nginx反向代理 ...

  6. 关于background-*的一些属性

    1.盒模型 盒模型从外到内一次为:margin-box.border-box.padding-box.content-box. 2.一些属性设置的相对位置 ⑴background-position的属 ...

  7. 软件开发架构,网络编程简介,OSI七层协议,TCP和UDP协议

    软件开发架构 什么是软件开发架构 1.软件架构是一个系统的草图. 2.软件架构描述的对象是直接构成系统的抽象组件. 3.各个组件之间的连接则明确和相对细致地描述组件之间的通讯. 4.在实现阶段,这些抽 ...

  8. python之数据类型的内置方法(set、tuple、dict)与简单认识垃圾回收机制

    目录 字典的内置方法 类型转换 字典取值 修改值 计算字典长度 成员运算 删除元素 获取元素 更新字典 快速生成字典 setdefault()方法 元组的内置方法 类型转换 索引与切片操作 统计长度 ...

  9. 如何让 Windows 把 TypeScript 文件当作文本文件

    TL;DR 修改注册表项 HKEY_CLASSES_ROOT\.ts 为 HKEY_CLASSES_ROOT\.txt 的值 起因 Windows10 总把 TypeScript 文件自动当成视频,放 ...

  10. NBMiner42.1版本发布,完全解锁30系LHR版本显卡

    2021年下半年,NVIDIA发布了LHR版本显卡,对显卡算力进行了限制. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核中加入了100%LHR解锁器,适用于Wind ...