Java多线程——wait方法和notify方法的详解

wait():等待,如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify()方法才能唤醒。

notify():唤醒,唤醒线程池等待线程其中的一个。

notifyAll():唤醒线程池所有等待线程。

wait与notify方法要注意的事项:

1. wait方法与notify方法是属于Object对象的。

2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能使用。

3. wait方法与notify方法必须要由所对象调用。

消费者与生产者例子:

生产者:
public void run() {
  int i = 0 ;
  while(true){
    synchronized (p) {
      if(p.flag==false){
        if(i%2==0){
          p.name = "苹果";
          p.price = 6.5;
        }else{
          p.name="香蕉";
          p.price = 2.0;
        }
        System.out.println("生产者生产出了:"+ p.name+" 价格是:"+ p.price);
        p.flag = true;
        i++;
        p.notifyAll(); //唤醒消费者去消费
      }else{
        //已经生产 完毕,等待消费者先去消费
        p.wait(); //生产者等待

      }

消费者:
public void run() {
  while(true){
    synchronized (p) {
      if(p.flag==true){ //产品已经生产完毕
        System.out.println("消费者消费了"+p.name+" 价格:"+ p.price);
        p.flag = false;
        p.notifyAll(); // 唤醒生产者去生产
      }else{
        //产品还没有生产,应该 等待生产者先生产。
        p.wait(); //消费者也等待了...
      }

在这段代码中锁对象为p,

wait():一个线程如果执行了wait方法,那么该线程就会进去一个以锁对象为标识符的线程池中等待。

在生产者与消费者代码中,线程执行了wait方法会进入以p为标识符的线程池中等待。

notify():如果一个线程执行了notify方法,那么就会唤醒以锁对象为标识符的线程池中等待线程中其中一个。

原文地址:https://www.cnblogs.com/WXYleo/p/9747711.html

时间: 2024-08-30 06:15:14

Java多线程——wait方法和notify方法的详解的相关文章

java中paint方法和paintComponent方法的不同

/* 1.由Component.java源代码中可以看见其中的paint()方法体是空的,在Container中重写了该方法,其子类Window等也重写了该方法 2.由JComponent.java源代码中可以看见其中的paint()方法中调用paintComponent, paintChildren, paintBorder等方法: 所以该类中的paint方法会影响子组件的绘制, 而paintComponent方法只会影响该组件本身 3.paint方法 和 paintComponent方法都是

Java连载56-toSting方法和equals方法

Java连载56-toSting方法和equals方法一.关于object中的toString?方法: 1.SUN公司在Object类中设计toString方法的目的:返回java对象的字符串的表示形式. 2.在现实的开发过程中,Object里面的toString方法已经不够用了,因为Object的toString方法实现?的结果不满意.Object中的toString方法实现的结果不满意.Object中的呢toString?方法要被重写了. 3.println打印的如果是对象的话,那么就会默认

java多线程模式ThreadLocal原理简述及其使用详解

原创整理不易,转载请注明出处:java多线程模式ThreadLocal原理简述及其使用详解 代码下载地址:http://www.zuidaima.com/share/1781557457128448.htm ThreadLocal是为了使每个线程保存一份属于自己的数据. 先看一个使用ThreadLocal的实例. package com.zuidaima.aop.framework; import com.zuidaima.core.NamedThreadLocal; public abstra

“全栈2019”Java多线程第十九章:死锁详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多线程第十九章:死锁详解 下一章 "全栈2019"Java多线程第二十章:同步方法产生死锁的例子 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组&q

Java重写equals方法和hashCode方法

package com.ddy; public class User {     private Integer id; private String name; private String address; private String phone; public Integer getId() {         return id;     } public void setId(Integer id) {         this.id = id;     } public Strin

Java 重写hashCode 方法和equals方法

package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复 |---HashSet:底层数据结构是哈希表 | HashSet是如何保证元素唯一性呢? | 是通过两个方法来完成的 hashCode 和 equals来完成的 | 如果元素的hashCode值相同,才会判断 equals 是否为true | 如果hashCode值不相同,不会调用

java种instanceof方法和getclass方法的区别

在比较一个类是否和另一个类属于同一个类实例的时候,我们通常可以采用instanceof和getClass两种方法通过两者是否相等来判断,但是两者在判断上面是有差别的,下面写个测试类. public class Test5 { public static void testInstanceof(Object x) { System.out.println("x instanceof Parent: "+(x instanceof Parent)); System.out.println(

wait方法和sleep方法的区别

一.概念.原理.区别 Java中的多线程是一种抢占式的机制而不是分时机制.线程主要有以下几种状态:可运行,运行,阻塞,死亡.抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行. 当有多个线程访问共享数据的时候,就需要对线程进行同步.线程中的几个主要方法的比较: Thread类的方法:sleep(),yield()等 Object的方法:wait()和notify()等 每个对象都有一个机锁来控制同步访问.Synchronized关键字可以和对象的机锁交互,来实现线程的同步. 由于s

java 数组的 toString 方法和 equals 方法以及 java.lang.Object 对象的 toString 方法和 equals 方法

1 public class Test { 2 public static void main(String[] args) { 3 int[] a = {1, 2, 4, 6}; 4 int[] b = a; 5 int[] c = {1, 2, 4, 6}; 6 7 //下面这个方法打印的是a数组的引用地址 8 System.out.println(a.toString()); 9 //下面这个方法比较的是两个数组的引用是否相等 10 System.out.println("a.equals