返回顶部
首页 > 资讯 > 精选 >浅谈Java线程间通信之wait/notify
  • 537
分享到

浅谈Java线程间通信之wait/notify

java线程waitnotify 2023-05-31 12:05:00 537人浏览 泡泡鱼
摘要

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。先来我们来看下相关定义:wait() :调用该方法的线程进入WA

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。先来我们来看下相关定义:

wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的

wait(long):超时等待最多long毫秒,如果没有通知就超时返回。

notify() :通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到了对象的锁。

notifyAll():通知所有等待在该对象上的线程。

一个小例子

我们来模拟个简单的例子来说明,我们楼下有个小小的饺子馆,生意火爆,店里有一个厨师,一个服务员,为避免厨师每做好一份,服务员端出去一份,效率太低且浪费体力。现假设厨师每做好10份,服务员就用一个大木盘子端给客户,每天卖够100份就打烊收工,厨师服务员各自回家休息。

思考一下,要实现该功能,如果不使用等待/通知机制,那么最直接的方式可能就是,服务员隔一段时间去厨房看看,满10份就用盘子端出去。

这种方式有两个很大的弊病:

如果服务员去厨房看的太勤快,服务员太累了,这样还不如每做一碗就端一碗给客人,大木盘子的作用就体现不出来了。具体表现在实现代码层面就是:需要不断的循环,浪费处理器资源。

如果服务员隔很久才去厨房看一下,就无法确保及时性了,可能厨师早都做够10份了,服务员却没观察到。

针对上面这个例子,使用等待/通知机制就合理的多了,厨师每做够10份,就喊一声“饺子好了,可以端走啦”。服务员收到通知,就去厨房将饺子端给客人;厨师还没做够,即还没收到厨师的通知,就可以稍微休息下,但也得竖起耳朵等候厨师的通知。 

package ConcurrentTest;import thread.BlockQueue;public class JiaoziDemo {  //创建个共享对象做监视器用  private static Object obj = new Object();  //大木盘子,一盘最多可盛10份饺子,厨师做满10份,服务员就可以端出去了。  private static Integer platter = 0;  //卖出的饺子总量,卖够100份就打烊收工  private static Integer count = 0;    static class Cook implements Runnable{    @Override    public void run() {      while(count<100){        synchronized (obj){          while (platter<10){            platter++;          }          //通知服务员饺子好了,可以端走了          obj.notify();          System.out.println(Thread.currentThread().getName()+"--饺子好啦,厨师休息会儿");        }        try {          //线程睡一会,帮助服务员线程抢到对象锁          Thread.sleep(100);        } catch (InterruptedException e) {          e.printStackTrace();        }      }      System.out.println(Thread.currentThread().getName()+"--打烊收工,厨师回家");    }  }    static class Waiter implements Runnable{    @Override    public void run() {      while(count<100){        synchronized (obj){          //厨师做够10份了,就可以端出去了          while(platter < 10){            try {              System.out.println(Thread.currentThread().getName()+"--饺子还没好,等待厨师通知...");              obj.wait();              BlockQueue            } catch (InterruptedException e) {              e.printStackTrace();            }          }          //饺子端给客人了,盘子清空          platter-=10;          //又卖出去10份。          count+=10;          System.out.println(Thread.currentThread().getName()+"--服务员把饺子端给客人了");        }      }      System.out.println(Thread.currentThread().getName()+"--打烊收工,服务员回家");    }  }  public static void main(String []args){    Thread cookThread = new Thread(new Cook(),"cookThread");    Thread waiterThread = new Thread(new Waiter(),"waiterThread");    cookThread.start();    waiterThread.start();  }}

--结束END--

本文标题: 浅谈Java线程间通信之wait/notify

本文链接: https://lsjlt.com/news/225435.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 浅谈Java线程间通信之wait/notify
    Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。先来我们来看下相关定义:wait() :调用该方法的线程进入WA...
    99+
    2023-05-31
    java 线程wait notify
  • Java线程通信之wait-notify通信方式详解
    目录1.线程通信的定义2.为什么需要wait-notify3.wait方法和notify方法1、对象的wait()方法2、对象的notify()方法4.wait方法和notify方法...
    99+
    2024-04-02
  • Java使用wait和notify实现线程之间的通信
    目录一. 为什么需要线程通信二. wait和notify方法1. wait()方法2. notify()方法 3. notifyAll()方法三. 使用wait和notif...
    99+
    2024-04-02
  • Java如何使用wait/notify实现线程间通信
    本文小编为大家详细介绍“Java如何使用wait/notify实现线程间通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何使用wait/notify实现线程间通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-07-04
  • Java怎么使用wait或notify实现线程间通信
    这篇文章主要介绍“Java怎么使用wait或notify实现线程间通信”,在日常操作中,相信很多人在Java怎么使用wait或notify实现线程间通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎...
    99+
    2023-07-04
  • 浅谈Java线程间通信方式
    目录1.volatile和synchronized关键字2.等待/通知机制3.管道输入/输出流4.join()方法5.ThreadLocal()方法总结线程间通信方式有两种:共享内存...
    99+
    2024-04-02
  • Java线程通信中wait-notify通信的方式是什么
    这篇文章主要介绍“Java线程通信中wait-notify通信的方式是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java线程通信中wait-notify通信的方式是什么”文章能帮助大家解决问...
    99+
    2023-06-29
  • Java中怎么使用wait和notify实现线程间的通信
    这篇“Java中怎么使用wait和notify实现线程间的通信”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么使...
    99+
    2023-06-30
  • python浅谈一下线程间通信之队列
    目录为什么需要线程间通信线程间通信方式有哪些线程间通信案例之队列总结为什么需要线程间通信 一个人的力量是有限的,但是团队合作可以发挥更大的作用。而团队协作需要交流和通信来有效的分配任...
    99+
    2023-05-17
    Python线程通信 Python线程通信队列 python队列
  • Java多线程之死锁问题,wait和notify
    文章目录 一. synchronnized 的特性1. 互斥性2. 可重入性 二. 死锁问题1. 什么是死锁2. 死锁的四个必要条件3. 常见的死锁场景及解决3.1 不可重入造成的死锁3....
    99+
    2023-09-13
    java 死锁 wait notify synchronized
  • Java通过wait()和notifyAll()方法实现线程间通信
    本文实例为大家分享了Java实现线程间通信的具体代码,供大家参考,具体内容如下Java代码(使用了2个内部类):package Threads;import java.util.LinkedList;public class ProdCon...
    99+
    2023-05-31
    java wait notifyall
  • java多线程wait()和notify()如何使用
    小编给大家分享一下java多线程wait()和notify()如何使用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!注:wait()和notify()应当用在synchronized内package com.te...
    99+
    2023-06-02
  • 详谈java线程与线程、进程与进程间通信
    线程与线程间通信一、基本概念以及线程与进程之间的区别联系:关于进程和线程,首先从定义上理解就有所不同1、进程是什么?是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点在系统调度和单独的单位,也就是说进程是可以独 立运行...
    99+
    2023-05-31
    进程 线程 通信
  • Java多线程死锁问题详解(wait和notify)
    目录一. synchronnized 的特性1. 互斥性2. 可重入性二. 死锁问题1. 什么是死锁2. 死锁的四个必要条件3. 常见的死锁场景及解决3.1 不可重入造成的死锁3.2...
    99+
    2023-01-05
    Java多线程死锁 java死锁的原因及解决方法 java多线程死锁问题
  • Java多线程wait()和notify()方法详细图解
    目录一、线程间等待与唤醒机制二、等待方法wait()三、唤醒方法notify()四、关于wait和notify内部等待问题(重要)五、完整代码(仅供测试用)总结一、线程间等待与唤醒机...
    99+
    2022-11-13
    多线程wait notify 线程的wait和notify 线程notify和wait区别
  • 浅谈并发处理PHP进程间通信之System V IPC
    目录前言Unix System V IPC信号量共享内存消息队列函数介绍ftoksemaphore函数shared_memory函数代码实现小结前言 它的安装和使用非常简单,在编译 ...
    99+
    2024-04-02
  • Java并发编程之线程间的通信
    目录一、概念简介1、线程通信2、等待通知机制3、基础方法二、等待通知原理1、基本原理2、实现案例三、管道流通信1、管道流简介2、使用案例四、生产消费模式1、业务场景2、代码实现五、源...
    99+
    2024-04-02
  • 浅谈并发处理PHP进程间通信之外部介质
    目录进程间通信文件flock代码实现mysqlselect for update代码实现redisincrSETNX代码实现优化总结进程间通信 进程间通信,指至少两个进程或...
    99+
    2024-04-02
  • Java线程间通信方式
    前文了解了线程的创建方式和状态切换,在实际开发时,一个进程中往往有很多个线程,大多数线程之间往往不是绝对独立的,比如说我们需要将A和B 两个线程的执行结果收集在一起然后显示在界面上,又或者比较典型的消...
    99+
    2023-09-24
    java jvm 开发语言 android
  • Java学习之线程同步与线程间通信详解
    目录线程同步的概念同步代码块同步方法线程组线程组的相关方法线程组对象的基本应用线程间的通信线程通信简单应用线程同步的概念 由于同一个进程的多个线程共享同一块存储空间,在带来方便的同时...
    99+
    2022-12-27
    Java线程同步 Java线程通信 Java线程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作