采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
condition4Consumer和condition4Producer 都是用一个lock创建的,说明两个condition里面是一样的,只是两个Condition的对象名不一样。 为什么实际代码中却是condition4Consumer去让consumer线程唤醒或等待,condition4Producer去让producer线程唤醒或等待?
同学你好,这样命名只是为了做区分
再看一下代码生产者:
public class Producer extends Thread{ @Override public void run() { while (true){ Desk.lock.lock(); try { if(Desk.flag){ //厨师等待 try { Desk.condition4Producer.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } }else{ //厨师开始工作 System.out.println("厨师正在补充食物"); Desk.flag = true; System.out.println("producer 准备唤醒consumer"); Desk.condition4Consumer.signalAll(); } }finally { Desk.lock.unlock(); } } } }
消费者:
public class Consumer extends Thread{ @Override public void run() { while (true){ //不断地拿食物 Desk.lock.lock(); try { if(Desk.flag){ //如果有实物 拿走,并通知厨师 System.out.println("顾客取走食物"); Desk.flag = false; System.out.println("consumer 准备唤醒producer"); Desk.condition4Producer.signalAll(); }else{ try { Desk.condition4Consumer.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } } }finally { Desk.lock.unlock(); } } } }
做一些简化,只关注condition的部分
producer: if(..){ condition4Producer.await(); }else{ condition4Consumer.signalAll(); } consumer if(..){ condition4Producer.signalAll(); }else{ condition4Consumer.await(); }
你把他们的使用顺序反过来也是没问题的,例如
producer: if(..){ condition4Producer.signalAll(); }else{ condition4Consumer.await(); } consumer if(..){ condition4Producer.await(); }else{ condition4Consumer.signalAll(); }
使用的原则就是:在producer await的时候,使用同一个condition signal all consumer consumer await的时候,使用同一个condition signal all producer创建condition的时候不需要绑定,靠咱们使用的时候灵活控制
明白了,谢谢老师
登录后可查看更多问答,登录/注册
吃透并发编程,高效解决复杂问题,进入优秀工程师行列
229 5
222 3
208 2
247 2
131 2