黑马程序员技术交流社区

标题: 发现个有趣的现象,大家看一下,找一下答案 [打印本页]

作者: 王中利    时间: 2012-11-14 16:06
标题: 发现个有趣的现象,大家看一下,找一下答案
package day_nov_14;

class Resouse{
        private String name;
        private int count=1;
        private boolean flag=false;
        public synchronized void set(String name){
                if(flag)
                        try {wait();} catch (InterruptedException e) {e.printStackTrace();}
                this.name=name+count;
                count++;
                System.out.println(Thread.currentThread().getName()+".....生产者......生产者生成了"+this.name);
                flag=true;
                notify();
                        }
        public synchronized void out(){
                if(!flag);
                        try {wait();} catch (InterruptedException e) {e.printStackTrace();}
                System.out.println(Thread.currentThread().getName()+"==========消费者吃了====吃了"+this.name);
                flag=false;
                   notify();
        }
}
class Producer implements Runnable{
        private Resouse r;
        Producer (Resouse r){
                this.r=r;
        }

        public void run() {
                for(int x=1;x<=50;x++){
                        r.set("饭");
                }
               
        }
       
}

class Consumer implements Runnable{
        private Resouse r;
        Consumer (Resouse r){
                this.r=r;
        }

        public void run() {
                for(int x=1;x<=50;x++){
                        r.out();
                }
        }
}
public class ProduceVsConsumer {

        public static void main(String[] args) {
        Resouse re=new Resouse();
        Producer p=new Producer(re);
        Consumer c=new Consumer(re);
        Thread t1=new Thread(c);
        Thread t2=new Thread(p);
        t1.start();
        t2.start();
       
        }
}
最后两个线程开启的顺序不一样,运行结果就不一样。。。。
作者: 李桐    时间: 2012-11-14 16:28
第一种情况:t1先运行,消费者先落座等待,等待生产者生产,t2运行,生产者产出,flag变为true,消费者被唤醒,生产者等待,flag变为false,各循环50次,没有问题
第二种情况:t2先运行,flag为false,生产者陷入等待,t1再运行,判断"!flag"为真,消费者也陷入了等待......
所以,第一种情况跟第二种情况不一样
作者: 被遗弃者    时间: 2012-11-14 16:56
学习中!!!!!
作者: 黑马斯巴达    时间: 2012-11-14 17:06
第二种应该是t2运行,然后判断flag为flase运行一次,输出一次结果 。之后flag变为true。。。。此时notify只能唤醒生产者t2。。。这时生产者再次判断flag为true。。因此进入等待。而t1没有得到执行权……
作者: 黑马吕世成    时间: 2012-11-14 20:39
楼主能说说哪里不一样不!还真没看出来。。。
作者: 李卫源    时间: 2012-11-14 21:10
线程等待,然后通过标志来转换线程的运行




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