老师,看看注释是不是这样运行的

老师,看看注释是不是这样运行的

package com.icoom.model;

public class Test {
   int n=0;
   boolean flag=false;
   public synchronized int get(){
       /**
        * 第一次!flag等于true,执行wait方法等待线程(get方法所有代码不执行)
        * set方法唤醒后,此时flag是!true,不执行wait,输出第一次消费信息,再次将flag赋值为false,
        * 并且唤醒set方法线程,然后再次判断,此时flag为flash,从而执行wait方法等待
        */
       if(!flag){
           try{
               wait();
           }catch (InterruptedException e){
               e.printStackTrace();
           }
       }
       System.out.println("消费"+n);
       flag=false;
       notifyAll();
       return n;
   }
   public synchronized int set(){
       /**
        * 第一次false,不执行wait等待方法,并且输出生产信息,
        * 将false设置为true,并且唤醒get的线程,然后再次判断if,此时flag为true,执行wait等待,
        */
       if(flag){
           try{
               wait();
           }catch (InterruptedException e){
               e.printStackTrace();
           }
       }
       System.out.println("生产"+n);
      this.n=n;
      flag=true;
       notifyAll();
   }
}

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,1. 同学理解是正确的,是这样运行的。

2. 同学是想问,为什么循环调用get或者set方法后不直接执行完而是执行另个一个方法吗?如果是,则是因为每次线程执行完后,线程会进行休眠,如下图所示:此时很大程度上另一个线程会获得cpu执行权进行执行。如果不是,请同学重新描述一下。http://img1.sycdn.imooc.com//climg/5df839dd09e8f6a207050421.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 罗杰明 提问者 #1
    老师我是想问,假如set方法,flag不执行wait方法,输出生产消息,并且再次把flag修改为true,然后唤醒所有线程,此时是再次判断set方法还是直接进入休眠(执行get方法)
    2019-12-17 11:01:41
  • 好帮手慕小班 回复 提问者 罗杰明 #2
    同学你好,根据同学的描述,再次执行的内容是直接进入休眠-->执行get方法。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-12-17 15:42:38
提问者 罗杰明 2019-12-16 22:52:07

另外线程如果没有假如循环不是只执行一次吗,为什么能二次执行if语句

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师