public class ThreadNotifySample {
public static void main(String[] args) {
// Res res = new Res();
// Input input = new Input(res);
// Output output = new Output(res);
// Thread t1 = new Thread(input);
// Thread t2 = new Thread(output);
// t1.start();
// t2.start();
/**
* 上面会出现下面的情况
* hangsan----male
* zhangsan----male
* zhangsan----male
* zhangsan----女
* 李琳----女
* 李琳----女
* 李琳----male
* 李琳----male
* 李琳----女
* */
//下面实现了线程之间的通讯,等待唤醒机制,input放进去一个数据,output取出一个数据
Res res = new Res();
Input2 i2 = new Input2(res);
Output2 o2 = new Output2(res);
Thread t3 = new Thread(i2);
Thread t4 = new Thread(o2);
t3.start();
t4.start();
/**
* 显示如下
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
* zhangsan----male
* 李琳----女
*/
}
}
class Res {
String userName;
String userSex;
boolean flag;
}
class Input implements Runnable {
private Res res;
Input(Res res) {
this.res = res;
}
@Override
public void run() {
int x = 0;
while (true) {
if (x == 0) {
res.userName = "zhangsan";
res.userSex = "male";
} else {
res.userName = "李琳";
res.userSex = "女";
}
x = (x + 1) % 2;
}
}
}
class Output implements Runnable {
private Res res;
Output(Res res) {
this.res = res;
}
@Override
public void run() {
while (true) {
System.out.println(res.userName + "----" + res.userSex);
}
}
}
class Input2 implements Runnable {
private Res res;
Input2(Res res) {
this.res = res;
}
@Override
public void run() {
int x = 0;
while (true) {
synchronized (res) { //添加同步代码块,锁定内存中同一个对象
if (res.flag) {
try {
res.wait(); //有数据尚未被Output2取走数据则等待 Output2处理完
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
if (x == 0) {
res.userName = "zhangsan";
res.userSex = "male";
} else {
res.userName = "李琳";
res.userSex = "女";
}
x = (x + 1) % 2;
res.flag = true; //有数据
res.notify(); //放完数据通知Output2来取走数据
}
}
}
}
}
class Output2 implements Runnable {
private Res res;
Output2(Res res) {
this.res = res;
}
@Override
public void run() {
while (true) {
synchronized (res) { //添加同步代码块,锁定内存中同一个对象
if (res.flag) { //有数据待处理,则取出处理
System.out.println(res.userName + "----" + res.userSex);
res.flag = false; //无数据
res.notify(); //取完数据通知Input2继续放数据
} else {
try {
res.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}