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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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();
       
        }
}
最后两个线程开启的顺序不一样,运行结果就不一样。。。。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
第一种情况:t1先运行,消费者先落座等待,等待生产者生产,t2运行,生产者产出,flag变为true,消费者被唤醒,生产者等待,flag变为false,各循环50次,没有问题
第二种情况:t2先运行,flag为false,生产者陷入等待,t1再运行,判断"!flag"为真,消费者也陷入了等待......
所以,第一种情况跟第二种情况不一样

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
学习中!!!!!
回复 使用道具 举报
第二种应该是t2运行,然后判断flag为flase运行一次,输出一次结果 。之后flag变为true。。。。此时notify只能唤醒生产者t2。。。这时生产者再次判断flag为true。。因此进入等待。而t1没有得到执行权……

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
黑马吕世成 来自手机 中级黑马 2012-11-14 20:39:59
报纸
楼主能说说哪里不一样不!还真没看出来。。。来自: Android客户端
回复 使用道具 举报
线程等待,然后通过标志来转换线程的运行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马