class Res{ String name; String sex; boolean 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){ if(r.flag) try{r.wait();}catch(Exception e){} if(x==0){ r.name = "mike"; r.sex = "man"; } else{ r.name = "哈哈"; r.sex = "女"; } x = (x+1)%2; r.flag = true; r.notify(); } } } } 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 InputOutput{ 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(); } } /* wait();notify();notifyAll(); 都使用在同步中,因为要对持有监视器(锁)的线程中操作。 所以要使用在同步中,因为只有同步才具有锁。 为什么这些操作线程的方法要定义在Object类中呢? 因为这些方法在操作同步的线程时,都必须要标识它们所操作 线程持有的锁。只有同一个锁上的被等待线程,可以被同一个锁上的 notify唤醒。不可以对不同锁中的线程进行唤醒。 也就是说,等待和唤醒必须是同一个锁。 而锁可以是任意对象,所以可以被任意对象调用的方法定义在Object 类中。 */
代码优化
class Res{ private String name; private String sex; 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 InputOutput{ public static void main(String[] args){ Res r = new Res(); new Thread(new Input(r)).start(); new Thread(new Output(r)).start(); /*Input in = new Input(r); Output out = new Output(r); Thread t1 = new Thread(in); Thread t2 = new Thread(out); t1.start(); t2.start();*/ } }