写两个类,Input,output
两个都是使用同步代码块的方式实现线程间的同步
input类,是为变量赋值
output类,是打印变量
由于线程争夺cpu造成数据的不匹配
通过,设立一个 flag 标志位,当flag=true的时候当前赋值等待,等待打印结束完成,唤醒赋值线程,flag=flase 打印值等待,等待赋值线程完成赋值,唤醒打印线程
package demo04;
/*
* 定义资源类,有2个成员变量
* name,sex
* 同时有2个线程,对资源中 的变量操作
* 1个对name,age赋值
* 2个对name,age做变量的输出da'yin
*/
public class Resource {
public String name;
public String sex;
public boolean flag;
}
package demo04;
/*
* 输入的线程,对资源对象Resource中成员变量赋值
* 一次赋值张三,男
* 下一次赋值lisi,女
*/
public class Input implements Runnable {
private Resource r ; public Input(Resource r){
this.r = r;
} public void run() {
int i = 0 ;
while(true){
synchronized(r){
//标记是true,等待
if(r.flag){
try{r.wait();}catch(Exception ex){}
} if(i%2==0){
r.name = "张三";
r.sex = "男";
}else{
r.name = "lisi";
r.sex = "nv";
}
//将对方线程唤醒,标记改为true
r.flag = true;
r.notify();
}
i++;
}
} }
package demo04;
/*
* 输出线程,对资源对象Resource中成员变量,输出值
*/
public class Output implements Runnable {
private Resource r ; public Output(Resource r){
this.r = r;
}
public void run() {
while(true){
synchronized(r){
//判断标记,是false,等待
if(!r.flag){
try{r.wait();}catch(Exception ex){}
}
System.out.println(r.name+".."+r.sex);
//标记改成false,唤醒对方线程
r.flag = false;
r.notify();
}
}
} }
package demo04;
/*
* 开启输入线程和输出线程,实现赋值和打印值
*/
public class ThreadDemo{
public static void main(String[] args) { Resource r = new Resource(); Input in = new Input(r);
Output out = new Output(r); Thread tin = new Thread(in);
Thread tout = new Thread(out); tin.start();
tout.start();
}
}