Java中线程的状态与唤醒机制

目录

线程的状态图

代码实现无限等待案例

唤醒方法

等待唤醒机制

线程间的通信

等待唤醒机制

代码实现等待唤醒机制


 

线程的状态图

 

新建、运行、阻塞、休眠、无限等待、死亡

Java中线程的状态与唤醒机制 

休眠状态图

Java中线程的状态与唤醒机制

 

阻塞状态图

Java中线程的状态与唤醒机制

 

无限等待状态

Java中线程的状态与唤醒机制

 

 

代码实现无限等待案例

 

顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行。同步使用的锁对象必须保证唯一,只有锁对象才能调用wait和notify方法

Java中线程的状态与唤醒机制

Java中线程的状态与唤醒机制

 

 

唤醒方法

 

对于休眠等待状态

1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态

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

 

唤醒的方法

void notify() 唤醒在此对象监视器上等待的单个线程。

void notifyAll() 唤醒在此对象监视器上等待的所有线程

 

 

等待唤醒机制

 

线程间的通信

概念

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

Java中线程的状态与唤醒机制

 

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

多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望它们有规律的执行,那么多线程之间需要一些协调通信,以此来帮助我们达到多线程共同操作一份数据。

 

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

多个线程在处理同一个资源并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。因此需要通过一定的手段使各个线程能有效利用资源。而这种手段就叫做——等待唤醒机制

 

等待唤醒机制

等待唤醒机制其实就是经典的生产者与消费者问题

Java中线程的状态与唤醒机制

 

注意事项

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

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

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

 

 

代码实现等待唤醒机制

 

包子类

Java中线程的状态与唤醒机制

 

包子铺类(生产者)

Java中线程的状态与唤醒机制

Java中线程的状态与唤醒机制

 Java中线程的状态与唤醒机制

 

吃货类(消费者)

Java中线程的状态与唤醒机制

Java中线程的状态与唤醒机制

 

测试类

Java中线程的状态与唤醒机制