动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

java多线程等待唤醒机制的实现

06-22 19:29 304浏览
举报 T字号
  • 大字
  • 中字
  • 小字

假设现在有两条正在运行的线程,一条线程专门输入数据,另外一条专卖负责读取数据。并且要实现,输入一个数据过后,另一方取出一个数据。在java多线程的情况下,当输入线程抢到CPU的执行权后,下一次还有可能是输入线程抢到CPU的执行权,就达不到我们想过要的效果。因此,我们需要输入线程执行一次过后,就让它等待,并叫醒输出线程。然后让输出线程执行,执行一次后等待,并且叫醒输入线程。就这样循环往复,从而达到我们需要的线程的运行状态。java多线程等待唤醒机制的诞生为了解决循环等待消耗CPU以及信息及时性问题通俗来讲就是由主动变为被动,当条件成立时,主动通知对应的线程,而不是让线程本身来询问

实现步骤

  1. 创建User类

这个类帮助我们模拟实现数据的输入输出

2.创建一个输入线程Input类

这一步是等待唤醒机制的核心部分。输入线程第一次进来时fig为false,继续往下执行。set过后,将fig改为true,并且唤醒下一个线程(输出线程)。就算下一次输入线程又抢到了CPU的执行权,判断fig为true则等待。

3.创建一个输出线程Output类

假如输出线程第一次抢到CPU的执行权,判断fig为false(User对象默认值为false),等待。当输入线程执行一遍后,就会将fig改为true并且唤醒输出线程,此时输出线程才具备执行资格。输出线程执行一遍后,将fig置为false,并唤醒输入线程,以此往复。 

4.创建一个测试类

 

让我们来看下最后的运行结果:

从输出结果上不难看出输入输出线程是来回切换的通过整个程序的代码以及结果我们可以看出:

1)等待唤醒机制使用了wait()和notify()方法(也可以使用notifyAll()方法)

2)构造方法方法是Object类中的,因为这几个方法是通过同步锁对象来调用的,而同步锁对象可以为任意对象,所以这几个方法定义在Object中很合理

3)使用wait()方法后会释放同步锁对象,这样其他的线程就可以获取该锁对象进入业务处理;并且在重新获取锁对象的时候,会再次进入同样的代码位置

4)两个线程必然有逻辑上的业务关系,不然这种用法毫无意义。

5)等待唤醒机制本质上是线程间通讯的一种体现或者实现方式

 

 

 

 

 

 

 

实际上等待、唤醒是线程间通信的手段之一,用来协调多个线程操作同一个数据源。java多线程等待唤醒机制能够有效地帮助我们解决优化循环等待的问题能够让线程有序的进行。在今后的编程中我们不可避免的要用到java多线程等待唤醒机制,让它成为我们手中的利刃,帮助我们破开编程开发中遇到的迷障。

0人推荐
共同学习,写下你的评论
0条评论
冷酷自尊VIP
程序员冷酷自尊VIP

5篇文章贡献26210字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消