黑马程序员技术交流社区

标题: 多线程通信 [打印本页]

作者: 左华清    时间: 2012-2-22 18:35
标题: 多线程通信
本帖最后由 左华清 于 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;
}
作者: 沈样    时间: 2012-2-22 22:42
这里锁对象的问题, synchronized(q)锁是Q,你notify应该也是q,改成q.notify()就可以运行了
作者: 左华清    时间: 2012-2-23 11:39
嗯,谢谢!
真是这样子的,解决了!
作者: 马胜平    时间: 2012-2-23 12:12
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。




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