黑马程序员技术交流社区

标题: 同步通信打印 找不出问题 大侠们帮忙看看 [打印本页]

作者: 宗士为    时间: 2012-5-5 12:26
标题: 同步通信打印 找不出问题 大侠们帮忙看看
package cn.cast.day13;

public class DatebaseDemo {
        public void main(String[] args) {
                Database db = new Database();
                new DBA(db).start();
                new Developer(db).start();
        }
}

class Database {
        String name;
        String gender;
        boolean isUpdate;
}

class DBA extends Thread {
        private Database db;
        private int times;

        public DBA(Database db) {
                this.db = db;
        }
       
       
        public void run() {
                while(true)
                        synchronized(db) {
                                if(db.isUpdate)
                                        try {
                                                db.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                if(times++ % 2 == 0) {       
                                        db.name = "宗";
                                        db.gender = "男";
                                }else if(times++ % 2 == 1) {
                                        db.name = "宋";
                                        db.gender = "女";
                                }
                                        db.isUpdate = true;
                                        db.notify();
                        }
        }
}

class Developer extends Thread {
        private Database db;
       
        public Developer(Database db) {
                this.db = db;
        }
       
        public void run() {
                while(true)
                        synchronized(db) {
                                if(db.isUpdate)
                                        try {
                                                db.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        System.out.println(db.name + db.gender);
                                db.isUpdate = false;
                                db.notify();
                        }
        }
}
作者: 魏宇    时间: 2012-5-5 13:05
package cn.cast.day13;

public class DatebaseDemo {
        public void main(String[] args) {  //主方法中少了static关键字
                Database db = new Database();
                new DBA(db).start();
                new Developer(db).start();
        }
}

class Database {
        String name;
        String gender;
        boolean isUpdate;
}

class DBA extends Thread {
        private Database db;
        private int times;

        public DBA(Database db) {
                this.db = db;
        }
        
        
        public void run() {
                while(true)
                        synchronized(db) {
                                if(db.isUpdate)
                                        try {
                                                db.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                if(times++ % 2 == 0) {        
                                        db.name = "宗";
                                        db.gender = "男";
                                }else if(times++ % 2 == 1) {    //这里的判断有误,应用else语句,直接用else就可以。
                                        db.name = "宋";
                                        db.gender = "女";
                                }
                                        db.isUpdate = true;
                                        db.notify();
                        }
        }
}

class Developer extends Thread {
        private Database db;
        
        public Developer(Database db) {
                this.db = db;
        }
        
        public void run() {
                while(true)
                        synchronized(db) {
                                if(db.isUpdate) //这里条件错误,改成 if(!db.isUpdate)
                                        try {
                                                db.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        System.out.println(db.name + db.gender);
                                db.isUpdate = false;
                                db.notify();
                        }
        }
}
作者: Zhang_qian    时间: 2012-5-5 13:41
首先是mian方法里面上少了一个关键字static,这样的话类加载的时候不会运行mian方法,还有就是你的Developer 类中的run方法中的  if(db.isUpdate)这个判断条件不正确,应该是
if(!db.isUpdate) ,还有就是你的DBA类中的第二个if方法也不对,如果你用if    else  if       的话它默认的后面还有一个else 只要上面两个人以执行了一个那么你的       db.isUpdate = false;
db.notify();就会执行不到,就不能改变isUpdate的值了也不能唤醒DBA了
                                                                 




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