返回顶部
首页 > 资讯 > 精选 >Java的等待通知机制是什么
  • 956
分享到

Java的等待通知机制是什么

2023-06-03 03:06:59 956人浏览 八月长安
摘要

这篇“Java的等待通知机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java的等待通知机制是什么”文章吧。Jav

这篇“Java的等待通知机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java的等待通知机制是什么”文章吧。

Java的等待通知机制
  在有些时候,我们需要在几个或多个线程中按照一定的秩序来共享一定的资源。例如生产者--消费者的关系,在这一对关系中实际情况总是先有生产者生产了产品后,消费者才有可能消费;又如在父--子关系中,总是先有父亲,然后才能有儿子。然而在没有引入等待通知机制前,我们得到的情况却常常是错误的。

消费者的例子:

// 共享的数据对象
 class ShareData{
 private char c;
 
 public void setShareChar(char c){
 this.c = c;
 }
 
 public char getShareChar(){
 return this.c;
 }
 }
 
 // 生产者线程
 class Producer extends Thread{
 
 private ShareData s;
 
 Producer(ShareData s){
 this.s = s;
 }
 
 public void run(){
 for (char ch = 'A'; ch <= 'Z'; ch++){
 try{
 Thread.sleep((int)Math.random() * 4000);
 }catch(InterruptedException e){}
 
 // 生产
 s.setShareChar(ch);
 System.out.println(ch + " producer by producer.");
 }
 }
 }
 
 // 消费者线程
 class Consumer extends Thread{
 
 private ShareData s;
 
 Consumer(ShareData s){
 this.s = s;
 }
 
 public void run(){
 char ch;
 
 do{
 try{
 Thread.sleep((int)Math.random() * 4000);
 }catch(InterruptedException e){}
 // 消费
 ch = s.getShareChar();
 System.out.println(ch + " consumer by consumer.");
 }while(ch != 'Z');
 }
 }

class Test{
 public static void main(String argv[]){
 ShareData s = new ShareData();
 new Consumer(s).start();
 new Producer(s).start();
 }
}

  在以上的程序中,模拟了生产者和消费者的关系,生产者在一个循环中不断生产了从A-Z的共享数据,而消费者则不断地消费生产者生产的A-Z的共享数据。我们开始已经说过,在这一对关系中,必须先有生产者生产,才能有消费者消费。但如果运行我们上面这个程序,结果却出现了在生产者没有生产之前,消费都就已经开始消费了或者是生产者生产了却未能被消费者消费这种反常现象。为了解决这一问题,引入了等待通知(wait/notify)机制如下:
  1、在生产者没有生产之前,通知消费者等待;在生产者生产之后,马上通知消费者消费。
  2、在消费者消费了之后,通知生产者已经消费完,需要生产。
下面修改以上的例子(源自《用线程获得强大的功能》一文):

class ShareData{
 
 private char c;
 // 通知变量
 private boolean writeable = true;

 // ------------------------------------------------------------------------- 
 // 需要注意的是:在调用wait()方法时,需要把它放到一个同步段里,否则将会出现
 // "java.lang.IllegalMonitorStateException: current thread not owner"的异常。
 // -------------------------------------------------------------------------
 public synchronized void setShareChar(char c){
 if (!writeable){
 try{
 // 未消费等待
 wait();
 }catch(InterruptedException e){}
 }
 
 this.c = c;
 // 标记已经生产
 writeable = false;
 // 通知消费者已经生产,可以消费
 notify();
 }
 
 public synchronized char getShareChar(){
 if (writeable){
 try{
 // 未生产等待
 wait();
 }catch(InterruptedException e){} 
 }
 // 标记已经消费
 writeable = true;
 // 通知需要生产
 notify();
 return this.c;
 }
}

// 生产者线程
class Producer extends Thread{
 
 private ShareData s;
 
 Producer(ShareData s){
 this.s = s;
 }
 
 public void run(){
 for (char ch = 'A'; ch <= 'Z'; ch++){
 try{
 Thread.sleep((int)Math.random() * 400);
 }catch(InterruptedException e){}
 
 s.setShareChar(ch);
 System.out.println(ch + " producer by producer.");
 }
 }
}

// 消费者线程
class Consumer extends Thread{
 
 private ShareData s;
 
 Consumer(ShareData s){
 this.s = s;
 }
 
 public void run(){
 char ch;
 
 do{
 try{
 Thread.sleep((int)Math.random() * 400);
 }catch(InterruptedException e){}
 
 ch = s.getShareChar();
 System.out.println(ch + " consumer by consumer.**");
 }while (ch != 'Z');
 }
}

class Test{
 public static void main(String argv[]){
 ShareData s = new ShareData();
 new Consumer(s).start();
 new Producer(s).start();
 }
}

  在以上程序中,设置了一个通知变量,每次在生产者生产和消费者消费之前,都测试通知变量,检查是否可以生产或消费。最开始设置通知变量为true,表示还未生产,在这时候,消费者需要消费,于时修改了通知变量,调用notify()发出通知。这时由于生产者得到通知,生产出第一个产品,修改通知变量,向消费者发出通知。这时如果生产者想要继续生产,但因为检测到通知变量为false,得知消费者还没有生产,所以调用wait()进入等待状态。因此,最后的结果,是生产者每生产一个,就通知消费者消费一个;消费者每消费一个,就通知生产者生产一个,所以不会出现未生产就消费或生产过剩的情况。

五、线程的中断
  在很多时候,我们需要在一个线程中调控另一个线程,这时我们就要用到线程的中断。用最简单的话也许可以说它就相当于播放机中的暂停一样,当第一次按下暂停时,播放器停止播放,再一次按下暂停时,继续从刚才暂停的地方开始重新播放。而在Java中,这个暂停按钮就是Interrupt()方法。在第一次调用interrupt()方法时,线程中断;当再一次调用interrupt()方法时,线程继续运行直到终止。这里依然引用《用线程获得强大功能》一文中的程序片断,但为了更方便看到中断的过程,我在原程序的基础上作了些改进,程序如下:


class ThreadA extends Thread{
 
 private Thread thdOther;
 
 ThreadA(Thread thdOther){
 this.thdOther = thdOther;
 }
 
 public void run(){
 
 System.out.println(getName() + " 运行...");
 
 int sleepTime = (int)(Math.random() * 10000);
 System.out.println(getName() + " 睡眠 " + sleepTime
 + " 毫秒。");
 
 try{
 Thread.sleep(sleepTime);
 }catch(InterruptedException e){}
 
 System.out.println(getName() + " 觉醒,即将中断线程 B。");
 // 中断线程B,线程B暂停运行
 thdOther.interrupt();
 }
}

class Threadb extends Thread{
 int count = 0;
 
 public void run(){
 
 System.out.println(getName() + " 运行...");
 
 while (!this.isInterrupted()){
 System.out.println(getName() + " 运行中 " + count++);
 
 try{ 
 Thread.sleep(10);
 }catch(InterruptedException e){
 int sleepTime = (int)(Math.random() * 10000);
 System.out.println(getName() + " 睡眠" + sleepTime
 + " 毫秒。觉醒后立即运行直到终止。");
 
 try{
 Thread.sleep(sleepTime);
 }catch(InterruptedException m){}
 
 System.out.println(getName() + " 已经觉醒,运行终止...");
 // 重新设置标记,继续运行 
 this.interrupt();
 }
 }
 
 System.out.println(getName() + " 终止。"); 
 }
}

class Test{
 public static void main(String argv[]){
 ThreadB thdb = new ThreadB();
 thdb.setName("ThreadB");
 
 ThreadA thda = new ThreadA(thdb);
 thda.setName("ThreadA");
 
 thdb.start();
 thda.start();
 }
}

  运行以上程序,你可以清楚地看到中断的过程。首先线程B开始运行,接着运行线程A,在线程A睡眠一段时间觉醒后,调用interrupt()方法中断线程B,此是可能B正在睡眠,觉醒后掏出一个InterruptedException异常,执行其中的语句,为了更清楚地看到线程的中断恢复,我在InterruptedException异常后增加了一次睡眠,当睡眠结束后,线程B调用自身的interrupt()方法恢复中断,这时测试isInterrupt()返回true,线程退出。

以上就是关于“Java的等待通知机制是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Java的等待通知机制是什么

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

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

猜你喜欢
  • Java的等待通知机制是什么
    这篇“Java的等待通知机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java的等待通知机制是什么”文章吧。Jav...
    99+
    2023-06-03
  • 怎么理解Java线程间通信与等待/通知机制
    本篇内容主要讲解“怎么理解Java线程间通信与等待/通知机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java线程间通信与等待/通知机制”吧!一、概念简介1、线程通信在操作系统中,线...
    99+
    2023-06-02
  • java中的线程怎么实现等待与通知
    这篇文章给大家介绍java中的线程怎么实现等待与通知,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。关于等待/通知,要记住的关键点是:必须从同步环境内调用wait()、notify()、notifyAll()方法。线程不...
    99+
    2023-05-31
    java 线程 ava
  • java等待多线程执行完成的方法是什么
    Java中等待多线程执行完成的方法有以下几种:1. 使用Thread的join方法:调用线程的join方法可以等待该线程执行完成。例...
    99+
    2023-09-15
    java
  • Java的SPI机制是什么
    本篇内容介绍了“Java的SPI机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SPI的全名为Service Provider In...
    99+
    2023-06-17
  • Java的ClassLoader机制是什么
    本篇内容介绍了“Java的ClassLoader机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JVM在加载类的时候,都是通过Cla...
    99+
    2023-06-17
  • 详解java中的互斥锁信号量和多线程等待机制
    互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1 的概念,而信号量不止于此。也就是说,信号量可以使资源同时被多个线程访问,而互斥锁同时只能被一个线程访问互斥锁在java中...
    99+
    2023-05-31
    java 互斥锁 信号量
  • Java多线程之等待唤醒机制及案例代码演示
    生产者和消费者(等待唤醒机制) 等待唤醒机制常见方法代码演示等待唤醒机制(阻塞队列方式实现)额外扩展 等待唤醒机制 生产者和消费者是一个十分经典的多线程协作模式 举个小栗子来说明一下消费者...
    99+
    2023-10-25
    java 多线程 等待唤醒机制 thread Runnable notify wait
  • 深入探讨:Go语言主函数的等待机制
    标题:深入探讨:Go语言主函数的等待机制 Go语言作为一门高效、并发性强的编程语言,其特有的主函数等待机制在编写多线程程序时显得尤为重要。本文将深入探讨Go语言中主函数的等待机制,结合...
    99+
    2024-03-11
    go语言 主函数 等待机制
  • 通过注册表让Win7关机无需等待的技巧
      使用过Win7系统的用户都知道,每次关机的时候都需要等待,浪费了不少时间,其实通过注册表就能让Win7关机无需等待,大大的加快了关机速度,具体应该如何操作呢?   1.首先,同时按下win7系统键盘上的win+R快捷...
    99+
    2023-06-17
    Win7 关机 无需等待 技巧
  • java的多态机制是什么
    Java多态的实现机制是父类或接口定义的引用变量可以指向子类或实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实现对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。本质上多态分...
    99+
    2015-01-09
    java教程 java 多态机制
  • Java中的锁机制是什么
    今天小编给大家分享一下Java中的锁机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Java中的锁机制是保证多线程并...
    99+
    2023-07-05
  • Java中的SPI机制是什么
    这篇文章主要介绍“Java中的SPI机制是什么”,在日常操作中,相信很多人在Java中的SPI机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的SPI机制是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-05
  • android网络通信机制是什么
    Android网络通信机制是指Android系统中用于实现网络通信功能的一系列机制和API。Android系统提供了多种网络通信方式...
    99+
    2023-08-26
    android
  • 什么是java反射机制
    java:“一切即对象”,感觉java语言本身在不断践行着这句话。java反射机制的基础来源于一个Class类,我们可以通过这个类里面的方法来对每一个类进行读取、实例化等。对象表示或封装一些数据。一个类被加载后,jvm会创建一个对应该类的C...
    99+
    2019-08-24
    java入门 java 反射机制
  • java多态机制是什么
    java多态机制是什么java中实现多态的机制是依靠父类或接口的引用指向子类。从而实现了一个对象多种形态的特性。其中父类的引用是在程序运行时动态的指向具体的实例,调用该引用的方法时,不是根据引用变量的类型中定义的方法来运行,而是根据具体的实...
    99+
    2020-02-04
    java入门 java 多态机制
  • java反射机制是什么
    这篇文章主要介绍了java反射机制是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-14
  • 什么是Java回调机制
    这篇文章主要讲解了“什么是Java回调机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“什么是Java回调机制”吧!一、回调回调分为同步回调和异步回调, 假如以买彩票的场景来模拟, 我买彩票...
    99+
    2023-06-20
  • python进程间的通信机制是什么
    本文小编为大家详细介绍“python进程间的通信机制是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“python进程间的通信机制是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。进程间通信表示进程之间的数...
    99+
    2023-07-05
  • java运行机制指的是什么
    这篇文章给大家分享的是有关java运行机制指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java程序运行时,必须经过编译和运行两个步骤:首先将后缀名为java的源文件进行编译,最终生成后缀名为.clas...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作