Java中线程的状态与唤醒机制
目录
线程的状态图
新建、运行、阻塞、休眠、无限等待、死亡
休眠状态图
阻塞状态图
无限等待状态
代码实现无限等待案例
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行。同步使用的锁对象必须保证唯一,只有锁对象才能调用wait和notify方法
唤醒方法
对于休眠等待状态
1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,睡醒后的线程进入到Runnable/Blocked状态
唤醒的方法
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程
等待唤醒机制
线程间的通信
概念
多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同
为什么要处理线程间的通信
多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望它们有规律的执行,那么多线程之间需要一些协调通信,以此来帮助我们达到多线程共同操作一份数据。
如何保证线程间通信有效利用资源
多个线程在处理同一个资源并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。因此需要通过一定的手段使各个线程能有效利用资源。而这种手段就叫做——等待唤醒机制
等待唤醒机制
等待唤醒机制其实就是经典的生产者与消费者问题
注意事项
1.wait方法和notify方法必须要由同一个锁对象调用。因为对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程。
2.wait方法与notify方法是属于Object类的方法的。因为锁对象可以是任意对象,而任意对象的所属类都是集成了Object类的
3.wait方法与notify方法必须要在同步代码块或者同步函数中使用。因为必须要通过锁对象调用这2个方法。
代码实现等待唤醒机制
包子类
包子铺类(生产者)
吃货类(消费者)
测试类