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