黑马程序员技术交流社区

标题: java中的flag标记问题 [打印本页]

作者: 慕容冰若    时间: 2014-3-19 20:38
标题: java中的flag标记问题
今天看视频,看到以下代码:
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到底代表什么??

作者: 郭黎明    时间: 2014-3-19 20:42
首先定义了 private boolean flag = false,那么flag便是false,!flag便是true
作者: 多一点    时间: 2014-3-19 20:58
boolean flag ;默认是flase
boolean flag =flase; 那么flag 就是false
flag==false 判断
!flag   非flase 即true
作者: duanyoujiji    时间: 2014-3-19 23:55
从主函数读起,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)就是为了让描述更接近实际,总不能说是先消费再生产吧。这样说你明白了吗

作者: 戒爱    时间: 2014-3-20 00:57
flag就是个boolean型变量代名词,“!”就是非的意思
比如:!真 = 假
作者: 坏米饭    时间: 2014-3-20 01:26
用Myeclipse的Debug模式调试代码,就能理解了~
作者: 慕容冰若    时间: 2014-3-20 11:04
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大括号里面的语句
作者: leon_hm    时间: 2014-3-20 11:18
慕容冰若 发表于 2014-3-20 11:04
是不是flag的值就代表了if括号里面的值,例如:如果if(flag),如果flag是true的话,就代表if(true),就 ...

是这样的。 !就是用来取非的。
作者: 慕容冰若    时间: 2014-3-20 11:20
恩,好。。。谢谢各位了额
作者: duanyoujiji    时间: 2014-3-20 12:39
慕容冰若 发表于 2014-3-20 11:04
是不是flag的值就代表了if括号里面的值,例如:如果if(flag),如果flag是true的话,就代表if(true),就 ...

是啊。就是这样。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2