等待唤醒机制(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():唤醒在此对象监视器(对象锁)上等待的所有线程。
posted @ 2020-10-30 23:18  小明-o3rr0r  阅读(102)  评论(0编辑  收藏  举报