zoukankan      html  css  js  c++  java
  • 等待唤醒机制(2)

    等待唤醒机制的代码实现。

    注意:
    包子铺线程和包子线程关系-->通信(互斥)
    必须同时使用同步技术保证两个线程只能有一个在执行。
    锁对象必须保证唯一,可以使用包子对象作为锁对象。
    包子铺和吃货的类就需要把包子对象作为参数传递进来。
    1. 需要在成员位置创建一个包子变量。
    2. 使用带参数构造方法,为这个包子变量赋值。

    线程状态概述

    当线程被创建启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。
    一般来说有六种状态:

    1. NEW(新建):线程刚被创建,但是并未启动,还没有调用start方法
    2. Runnable(可运行):线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。
    3. Blocked(锁阻塞):当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。
    4. Waiting(无限等待):一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
    5. Time_Waiting(休眠状态):同Waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接受到唤醒通知。带有超时参数的常用方法有Thread.sleep、Object.wait。
    6. Termingted(死亡状态):因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。

    Object类中wait带参方法和notifyAll方法

    进入到TimeWaiting(计时等待)有两种方式

    1. 使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态。
    2. 使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态。

    唤醒的方法:

    1. void notify():唤醒在此对象监视器(对象锁)上等待的单个线程。
    2. void notifyAll():唤醒在此对象监视器(对象锁)上等待的所有线程。
    文章未经本人允许,禁止转载。 有技术问题,可加好友讨论。 联系方式:QQ:MjgxMjMxODAzNQ== 微信:bzNycjByLVhpYW9taW5n
  • 相关阅读:
    K-Multiple Free set UVA-11246 (容斥原理)
    RAID! UVA-509 (奇偶校验)
    龙芯 fedora28 安装指南
    Kdenlive简明教程-简单的操作
    Kdenlive简明教程-开始
    Irrelevant Elements UVA-1635 (二项式定理)
    指针的指针笔记
    scanf 函数笔记
    printf 函数笔记
    龙芯 3A4000 Fedora28 安装笔记
  • 原文地址:https://www.cnblogs.com/Xiaoming0/p/13904805.html
Copyright © 2011-2022 走看看