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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梵天的梦 中级黑马   /  2014-3-2 22:31  /  580 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Resourse
{
        private String name;
        private int count = 1;
        private boolean flag;

        public synchronized void set(String name){
                if(flag){
                        //wait和notify前面默认是this,所以封装起来后不加this也可以
                        try{System.out.println("ABC");
                                wait();
                                System.out.println("123");
                        }catch(Exception e){}
                }
                this.name = name+"--"+count++;

                System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name);
                flag = true;
                notify();
        }

        public synchronized void get(){
//                if(!flag)
                        //线程wait被唤醒之后不会返回判断,直接向下执行
//                        try{wait();}catch(Exception e){}
               
                System.out.println(Thread.currentThread().getName()+"--消费者--"+this.name);
                flag = false;
                notify();
        }
}

class Producer implements Runnable
{
        Resourse res;

        Producer(Resourse res){
                this.res = res;
        }
       
        public void run(){
                while(true){
                        res.set("+商品+");
                }
        }
}

class Consumer implements Runnable
{
        Resourse res;

        Consumer(Resourse res){
                this.res = res;
        }

        public void run(){
                while(true)
                        res.get();
        }
}

class ProducerConsumerDemo
{
        public static void main(String[] args){
                Resourse r = new Resourse();
               
                Producer pro = new Producer(r);
                Consumer con = new Consumer(r);

                Thread t1 = new Thread(pro);

                Thread t2 = new Thread(con);


                t1.start();

                t2.start();

        }
}
我想问一下,如果t1线程被wait()后,t2线程执行到函数get方法中的notify唤醒了t0线程,那么这个时候t0线程一定得到锁吗(t0是被wait()结束的)?

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

1 个回复

倒序浏览
你的这里面不是总共是三个线程吗?一个是main ,一个是线程t1,一个是线程t2,哪来的线程t0,应该是t1 吧,这样的话,当t1等待,也就是释放执行权,随之释放锁,t2开始执行。当t2唤醒t1时,活着的线程是t1和t2,当线程t2遇到flag时条件满足,t2等待,t1获得锁了.

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马