请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

condition怎么知道去让哪些线程唤醒或者等待呢?

condition4Consumer和condition4Producer 都是用一个lock创建的,说明两个condition里面是一样的,只是两个Condition的对象名不一样。
为什么实际代码中却是condition4Consumer去让consumer线程唤醒或等待,condition4Producer去让producer线程唤醒或等待?

正在回答 回答被采纳积分+3

1回答

Alfred_li 2024-04-01 10:05:37

同学你好,这样命名只是为了做区分

再看一下代码
生产者:

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的时候不需要绑定,靠咱们使用的时候灵活控制

0 回复 有任何疑惑可以回复我~
  • 提问者 王小east #1
    明白了,谢谢老师
    回复 有任何疑惑可以回复我~ 2024-04-01 15:57:40
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信