【多线程】线程通信之等待/通知机制

一、概念

       线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体。线程间的通信就是成为整体的必用方案之一。可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使开发人员对各线程任务在处理的过程中进行有效的把控和监督。

二、线程的执行模式

       1、互不通信的多线程模式

       多个线程会在系统中并发执行。线程之间不需要处理共享的数据,也不需要进行动作协调,也就是多个独立的线程各自完成自己线程中的工作。如下图所示的两个线程,没有交集,各自执行各自的任务和逻辑。老死不相往来。

                                           

       2、基于共享容器协同的多线程模式

       在多个线程之间对共享的数据进行处理,例如生产者和消费者的例子,我们有一个队列用于生产和消费,那么这个队列就是多个线程共享的一个容器或者是数据对象,多个线程会并发地访问这个队列。

                                        

        像这种在多线程环境下对同一份数据的访问,我们需要保证线程安全

        3、通过事件协同的多线程模式

         除了并发访问的控制,线程间会存在着协调的需求,例如A、B两个线程,B线程需要等到某个状态或事件发生后才能继续自己的工作,而这个状态改变或者事件产生和A线程有关。那么在这个场景下,就需要完成线程间的协调。

                                   

       如上图所示,右侧的线程,在执行到某个步骤时需要等待一个事件,而这个事件由左侧线程触发。右侧线程一直阻塞直到事件通知到达后才继续自己的执行。

三、等待/通知机制

       等待/通知机制在生活中比比皆是,比如在“马玉涛麻辣烫”就餐时就会出现。  顾客自选菜品成功付款之后,服务员会给顾客一个卡号。然后顾客就处于"等待"(wait)的状态。片刻之后,顾客听到“叮咚,请XX号顾客到餐口取餐”的声音,这就相当于一种通知(notify)。这时顾客才会到餐口把自己的餐取走,并大快朵颐。

       方法wait()的的作用是使当前执行代码的线程进行等待,使当前线程置入“等待队列”,直到接收到通知或被中断为止。在调用wait()方法之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。在执行wait()方法后,当前线程立即释放锁。

       方法notify()也要在同步方法或同步代码块中调用,即在调用前,线程也必须获得该对象的对象级别锁。该方法用来通知那些处于wait状态的线程,对其发出通知notify,和wait不同的是,在执行notify方法后,

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值