java 生产者消费者_Java面试题:怎么让两个线程交替打印1和2(生产者消费者问题)

当年面试阿里巴巴时要求手写出代码!

看完这篇文章,你也会写!

wait和notify

Java中最经典的wait和notify。wait操作可以让一个线程阻塞,等待某个条件发生从而唤醒自己。notify可以唤醒一个阻塞在某条件上的线程。

wait用法:

synchronized(sharedMonitor) {    while(someCondition) {  // 必须用一个检查感兴趣的条件的while循环来包围wait()        sharedMonitor.wait();  // 因为wait方法的返回不一定意味着someCondition变成true了(可以假装返回;当someCondition中有多个条件谓词时,可能某个线程调用了notify使得某一个wait返回了)。    }}

notify用法:

synchronized(sharedMonitor) {        sharedMonitor.notify();}

生产者消费者问题

如何让两个线程交替输出1和2?

注意,使用条件队列,wait和notify来进行线程间的同步,需要注意到条件队列、条件谓词和锁之间的三元关系。条件队列比如同步容器,条件谓词即状态,如果某项工作完成了,则设置一个状态表示完成了,锁则是条件队列的锁,即同步容器的锁。

话不多说,上代码!

输出“1”的线程

按照本文开始介绍的“wait用法”和“notify用法”,我们先新创建一个线程,获取lockOne对象上的锁,while中设置一个条件flag,当flag不满足条件时,让当前线程进入wait阻塞状态,等待唤醒。

如果当前线程被唤醒了,说明另一个线程输出了“2”,则本线程该开始输出“1”了。所以输出1之后,把标志位flag设置一下,让对面线程能够接着输出“2”。

0e1af196a35ba541d6f8799e9ace7cec.png

输出“2”的线程

按照本文开始介绍的“wait用法”和“notify用法”,我们接着创建一个线程,获取同一个lockOne对象上的锁,while中设置上面那个线程相反的flag条件,即当对面线程进入阻塞状态时,表明我们这个线程该唤醒了,要输出“2”了。

c0750288834df867c812f1f00c0161e7.png

来,启动一下看看:

3c6bc591e74f8a09c00f50659daa2ac0.png

最后输出结果如我们所愿,交替输出了“1”和“2”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值