ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线程间通信和等待唤醒机制概述

2022-07-10 14:00:29  阅读:141  来源: 互联网

标签:-- 间通信 线程 notify 唤醒 包子 wait


线程间通信

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

比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,

一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。

 

为什么要处理线程间通信:

  多个线程并发执行时,在默认情况下CPU是随机切换线程的,我们需要多个线程来共同完成一件任务,并且我们

希望他们有规律的执行,那么多线程直接需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

如何保证线程间通信有效利用资源:

  多个线程处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作.

就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能

有效的利用资源。而这种手段即--等待唤醒机制。

 

等待唤醒机制概述

什么是等待唤醒机制

在一个线程进行了规定操作后,就进入等待状态( wait() ),等待其他线程执行完他们的指定代码过后

再将其唤醒( notify() ); 在有多个线程进行等待时,如果需要,可以使用 notifyAll() 来唤醒所有的等待线程。

wait/notify 就是线程间的一种协作机制。

 

等待与唤醒机制: 线程之间的通信

重点:有效的利用资源(生产一个包子,吃一个包子,再生产一个包子,在吃一个包子...)

 

 通信:对包子的状态进行判断

  没有包子-->吃货线程唤醒包子铺线程-->吃货线程等待-->包子铺线程做包子-->做好包子-->修改包子的状态为有

  有包子-->包子铺线程唤醒吃货线程-->包子铺线程等待-->吃货吃包子-->吃完包子-->修改包子的状态为没有

  没有包子-->吃货线程唤醒包子铺线程-->吃货线程等待-->包子铺线程做包子-->做好包子-->修改包子的状态为有

   ...

等待唤醒中的方法

  等待唤醒机制就是用于解决线程间通信的问题的, 使用到的3个方法:

    1.wait : 线程不在活动,不再参与调度, 进入wait set中,因此不会浪费CPU资源, 也不会去竞争锁了,

这时的线程状态即是WAITING。它还要等着别的线程执行一个 特别的动作 , 也即是通知( notify )在这个对象

上等待的线程从wait set 中释放出来,重新进入到调度队列 (ready queue)中

    2.notify:则选取所通知对象的wait set 中的一个线程释放; 列如: 餐馆有空位置后, 等候就餐最久的顾客最先入座。

    3.notifyAll: 则释放所通知对象的wait set 上的全部线程。

>如果能获取锁, 线程就从 WAITING 状态变成RUNNABLE 状态;

>否则,从 wait set 出来,又进入 entry set ,线程就从WAITING 状态又变成BLOCKED状态

调用wait和notify方法需要注意的细节:

  1,wait方法与notify方法必须要由同一个锁对象调用。因为:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程

  2.wait方法与notify方法时属于Object类的方法的. 因为:锁的对象可以是任意对象,而任意对象的所属类都是继承了Object类的。

  2.wait方法与notify方法必须要在同步代码块或者是同步函数中使用。因为:必须要通过锁对象调用这2个方法。

 

搜索

复制

标签:--,间通信,线程,notify,唤醒,包子,wait
来源: https://www.cnblogs.com/pengtianyang/p/16463082.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有