package cn.bruce.Thread;
//同步通信案例 目的:交替出现正确的输入值
public class WaitandWakeDemo {
public static void main(String[] args) {
Value v = new Value();// 建立唯一对象
input in = new input(v);
output ou = new output(v);
Thread t0 = new Thread(in);
Thread t1 = new Thread(ou);
t0.start();
t1.start();
}
}
class Value {
String name;
int age;
boolean flag = false;
public Value()
{
}
public Value(String name, int age)
{
this.name = name;
this.age = age;
}
}
class input implements Runnable {
int i;
Value v;
public input(Value v)// 要使用同一个对象传入
{
this.v = v;
}
public void run() {
while (true)
{
synchronized (v)// 同步代码块,与另一个进程使用同一个对象锁
{
if (v.flag)
{
try
{
v.wait();
} catch (Exception e)
{
e.printStackTrace();
}
}
if (i % 2 == 0)
{
v.name = "张三";
v.age = 18;
} else// 必须要等上面的值输出后再换成下面的输入
{
v.name = "李四";
v.age = 28;
}
v.flag = true;
v.notify();//唤醒
}
i++;
}
}
}
class output implements Runnable {
Value v;
public output(Value v)// 要使用同一个对象传入
{
this.v = v;
}
public void run() {
while (true)// 这里要等上面换了输入后再能再次打印
{
synchronized (v)// 同步代码块,与另一个进程使用同一个对象锁
{
// 判断标记 如果是false 那就等待
if (!v.flag)
{
try
{
v.wait();
} catch (Exception e)
{
e.printStackTrace();
}
}
System.out.println(v.name + "..." + v.age);
// 标记改为false
v.flag = false;
v.notify();
}
}
}
}
