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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左华清 黑马帝   /  2012-2-22 18:35  /  1688 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 左华清 于 2012-2-23 11:40 编辑

想实现"zhangshan:male","lisi:female"
老报错,请大家指点下!

package cn.itcast.threadtest;

public class ThreadCommunation {
        public static void main(String[]args){
                Q q=new Q();
                new Thread(new Producer(q)).start();
                new Thread(new Consumer(q)).start();
        }
}
class Producer implements Runnable{
        Q q;       
        public Producer(Q q){
                this.q=q;
        }
        public void run(){
                int i=0;
                while(true){
                        synchronized(q){
                                if(q.bFull){
                                        try{wait();}catch(Exception e){};
                                }
                                if(i==0){
                                        q.name="zhangshan";
                                        try{Thread.sleep(1);}catch(Exception e){};
                                        q.sex="male";
                                }else{
                                        q.name="lisi";
                                        q.sex="female";
                                }
                                q.bFull=true;
                                notify();
                        }
                        i=(i+1)%2;
                }
        }
       
}
class Consumer implements Runnable{
        Q q;
        public Consumer(Q q){
                this.q=q;
        }
        public void run(){
                while(true){
                        synchronized(q){
                                if(!q.bFull){
                                        try{wait();}catch(Exception e){};
                                }
                                System.out.print(q.name);
                                System.out.println(":"+q.sex);
                                q.bFull=false;
                                notify();
                        }
                }
        }
}

class Q{
        public String name="unknown";
        public String sex="unknown";
        public boolean bFull=false;
}

3 个回复

正序浏览
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。

评分

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

查看全部评分

回复 使用道具 举报
嗯,谢谢!
真是这样子的,解决了!
回复 使用道具 举报
这里锁对象的问题, synchronized(q)锁是Q,你notify应该也是q,改成q.notify()就可以运行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马