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(); } } } }