A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 慕容冰若 中级黑马   /  2014-3-19 20:38  /  5265 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看视频,看到以下代码:
class Resource
{
        private String name;
        private int count = 1;

        //定义标记。
        private boolean flag = false;
       
        //1,提供设置的方法。
        public synchronized void set(String name)
        {

                if(flag)
                        try{this.wait();}catch(InterruptedException e){}
                //给成员变量赋值并加上编号。
                this.name = name + count;
                //编号自增。
                count++;
                //打印生产了哪个商品。
                System.out.println(Thread.currentThread().getName()+"......生产者...."+this.name);

                //将标记改为true。
                flag = true;
                //唤醒消费者。
                this.notify();
        }
        public synchronized void out()
        {
                if(!flag)
                        try{this.wait();}catch(InterruptedException e){}
                System.out.println(Thread.currentThread().getName()+"....消费者...."+this.name);
                //将标记该为false。
                flag = false;
                //唤醒生产者。
                this.notify();
        }
}

//2,描述生产者。
class Producer implements Runnable
{
        private Resource r ;
        // 生产者一初始化就要有资源,需要将资源传递到构造函数中。
        Producer(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.set("面包");
                }
        }
}

//3,描述消费者。
class Consumer implements Runnable
{
        private Resource r ;
        // 消费者一初始化就要有资源,需要将资源传递到构造函数中。
        Consumer(Resource r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.out();
                }
        }
}

class ThreadDemo9
{
        public static void main(String[] args)
        {
                //1,创建资源对象。
                Resource r = new Resource();

                //2,创建线程任务。
                Producer pro = new Producer(r);
                Consumer con = new Consumer(r);

                //3,创建线程。
                Thread t1 = new Thread(pro);
                Thread t2 = new Thread(con);

                t1.start();
                t2.start();
        }
}

对于里面的flag和!flag不能理解。。。
请各位具体解释一下这两句里面flag到底代表什么??

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

9 个回复

倒序浏览
首先定义了 private boolean flag = false,那么flag便是false,!flag便是true
回复 使用道具 举报
boolean flag ;默认是flase
boolean flag =flase; 那么flag 就是false
flag==false 判断
!flag   非flase 即true
回复 使用道具 举报
从主函数读起,t1线程负责生产,调用到Set方法时,第一个if(flag)是判断是否要等待,flag初值是false,这时候也就不执行try{this.wait();}catch(InterruptedException e){},因为还没开始生产,之后就执行了this.name = name + count; count++;也就是说生产出了商品,这时候flag变成了true,并唤醒了t2,调用out()方法,这时if(!flag)就是ifalse了,所以就执行了 System.out.println(Thread.currentThread().getName()+"....消费者...."+this.name);消费了商品。   
这个例子是从t1说起的,其实运行的时候不一定要先执行哪个线程,如果先执行了t2,那么if(!flag)就是true了,所以没有商品呢t2就得等待t1生产完再唤醒它了。
if(flag)和if(!flag)就是为了让描述更接近实际,总不能说是先消费再生产吧。这样说你明白了吗

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报 1 0
flag就是个boolean型变量代名词,“!”就是非的意思
比如:!真 = 假
回复 使用道具 举报
用Myeclipse的Debug模式调试代码,就能理解了~
回复 使用道具 举报
duanyoujiji 发表于 2014-3-19 23:55
从主函数读起,t1线程负责生产,调用到Set方法时,第一个if(flag)是判断是否要等待,flag初值是false,这 ...

是不是flag的值就代表了if括号里面的值,例如:如果if(flag),如果flag是true的话,就代表if(true),就执行if后面大括号里面的语句。。。如果if(!flag)就代表if(false),就不执行if大括号里面的语句
回复 使用道具 举报
慕容冰若 发表于 2014-3-20 11:04
是不是flag的值就代表了if括号里面的值,例如:如果if(flag),如果flag是true的话,就代表if(true),就 ...

是这样的。 !就是用来取非的。
回复 使用道具 举报
恩,好。。。谢谢各位了额
回复 使用道具 举报
慕容冰若 发表于 2014-3-20 11:04
是不是flag的值就代表了if括号里面的值,例如:如果if(flag),如果flag是true的话,就代表if(true),就 ...

是啊。就是这样。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马