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