黑马程序员技术交流社区

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

作者: 以梦为码    时间: 2015-7-15 15:31
标题: 线程通信

/*
* 线程通信,定义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();
        }
}

作者: China_Riven    时间: 2015-7-15 16:49
看帖不回,天理难容
作者: 晓月残魂    时间: 2015-7-15 18:53
加油加油,我也刚刚看到这
作者: 鲤鱼仙    时间: 2015-8-3 22:20
还是烟花头乱




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