1
class Res {
private String sex;
private String name;
private boolean flag = false;
public synchronized void set(String name,String sex) {
if(flag)
try{this.wait();} catch(Exception e) {}
this.name = name;
this.sex = sex;
flag = true;
this.notify()
}
public synchronized void out() {
if(!flag)
try{this.wait();} catch(Exception e) {}
System.out.println(name+" "+sex);
flag = false()
}
}
class Input implements Runnable {
private Res r;
Input(Res r) {
this.r = r;
}
public void run () {
int x = 0;
while(true) {
synchronized (r) { //这里同步锁可以用r
if(r.flag) //当flag为true时等待 为false存数据
try{r.wait();} catch(Exception e) {} //wait 必须持有同步的锁
if(x==0) {
r.name = "mike";
r.sex = "man";
}
else {
r.name = "丽丽";
r.sex = "女";
}
x = (x+1)%2;
r.flag = true; //将flag改为true 使输出得以运行
r.notify(); //通常唤醒第一个被等待的 notifyAll()可以唤醒全部 唤醒也需要锁
}
}
}
}
class Output implements Runnable {
private Res r;
Output(Res r) {
this.r = r;
}
public void run() {
while(true) {
synchronized(r) {
if(!r.flag)
try{r.wait();} catch(Exception e) {}
System.out.println(r.name+"...."+r.sex);
r.flag = false;
r.notify();
}
}
}
}
class InputOutputDemo {
public static void main(String[] args) {
Res r = new Res();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread (in);
Thread t2 = new Thread (out);
t1.start();
t2.start();
}
}
优化
class Res {
private String sex;
private String name;
private boolean flag = false;
public synchronized void set(String name,String sex) {
if(flag)
try{this.wait();} catch(Exception e) {}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void out() {
if(!flag)
try{this.wait();} catch(Exception e) {}
System.out.println(name+" "+sex);
flag = false;
this.notify();
}
}
class Input implements Runnable {
private Res r;
Input(Res r) {
this.r = r;
}
public void run () {
int x = 0;
while(true) {
if(x==0)
r.set("mike","man");
else
r.set("丽丽","女");
x = (x+1)%2;
}
}
}
class Output implements Runnable {
private Res r;
Output(Res r) {
this.r = r;
}
public void run() {
while(true) {
r.out();
}
}
}
class InputOutputDemo2 {
public static void main(String[] args) {
Res r = new Res();
new Thread(new Thread (new Input(r))).start();
new Thread(new Thread (new Output(r))).start();
}
}