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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 以梦为码 中级黑马   /  2015-7-15 15:31  /  366 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


/*
* 线程通信,定义3个类
* 一个资源对象,Student类
* 一个生产者线程,赋值成员变量
* 一个消费者线程,打印成员变量值
* 多线程操作同一个共享数据 Student对象,产生数据的安全问题 -- 同步
* 使用同步,数据安全问题还是没解决,
* 1. 所有的共享数据都同步了吗 ,OK
* 2. 同步中的锁都是一把锁吗,整个程序唯一对象
*/

class Student{
        String name;
        String sex;
        boolean flag = false;
}
//定义生产者线程,对Student类的成员赋值
class Input implements Runnable{
        Student s ;
        Input(Student s){this.s = s;}
        public void run(){
                int x = 0 ;
                while(true){
                 synchronized(s){       
                         //对标记判断,如果是真,等待
                         if(s.flag)
                                 //等待
                                try{ s.wait();}catch(Exception ex){}
                        if(x%2==0){
                                s.name = "张三";
                                s.sex = "男";
                        }else{
                                s.name = "李四";
                                s.sex = "女";
                        }
                        x++;
                        //赋值完成后,标记改成true
                        s.flag = true;
                        s.notify();
                 }
                }
        }
}
//定义消费者线程,对Student类成会变量打印
class Output implements Runnable{
        Student s;
        Output(Student s){this.s=s;}
        public void run(){
                while(true){
                  synchronized(s){       
                          //判断标记,是假,不能赋值等待
                          if(!s.flag)
                                  //等待
                                  try{s.wait();}catch(Exception ex){}
                        System.out.println(s.name+"..."+s.sex);
                        //标记改成false
                        s.flag = false;
                        s.notify();
                  }
                }
        }
}

public class ThreadDemo {
        public static void main(String[] args) {
                Student s = new Student();
                Input in = new Input(s);
                Output out = new Output(s);
                Thread tin = new Thread(in);
                Thread tout = new Thread(out);
                tin.start();
                tout.start();
        }
}

3 个回复

倒序浏览
看帖不回,天理难容
回复 使用道具 举报
加油加油,我也刚刚看到这
回复 使用道具 举报
还是烟花头乱
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马