class Do8 { public static void main(String[] args) { Resource r =new Resource(); Input in =new Input(r); Output out=new Output(r); Thread t1=new Thread(in); Thread t2=new Thread(out); t1.start(); t2.start(); } } class Resource { String name; String sex; boolean flag=false; } //输入 class Input implements Runnable { Resource r; Input(Resource 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="往里"; r.sex="男"; } else { r.name="xiaoli"; r.sex="wumen"; } r.flag=true; r.notify();//启动任意的停止的线层 } x=(x+1)%2; } } } //输出 class Output implements Runnable { Resource r; Output(Resource r) { this.r=r; } public void run() { while(true) { synchronized(r) { if(!r.flag) { try{r.wait();}catch(Exception e){}//不为真的时候,当前线层停止 } try{Thread.sleep(100);}catch(Exception e){} System.out.println(r.name+"..."+r.sex); r.flag=false; r.notify();//启动任意的停止的线层 } } } }
练习
class Do9 { public static void main(String[] args) { Resource r=new Resource(); Shengchan sc=new Shengchan(r); Xiaoshou xs=new Xiaoshou(r); Thread th1=new Thread(sc); Thread th2=new Thread(xs); th1.start(); th2.start(); } } class Resource { private String name; private int count=1; private boolean flag=false; public synchronized void set(String name) { if(flag) try{this.wait();}catch(InterruptedException e){} this.name=name+count; count++; System.out.println(Thread.currentThread().getName()+"..生产者.."+this.name); flag=true; notify(); } public synchronized void out() { if(!flag) try{this.wait();}catch(InterruptedException e){} System.out.println(Thread.currentThread().getName()+"..消费者........"+this.name); flag=false; notify(); } } class Shengchan implements Runnable { private Resource r; Shengchan(Resource r) { this.r=r; } public void run() { while(true) { try{Thread.sleep(150);}catch(InterruptedException e){} r.set("烤鸭"); } } } class Xiaoshou implements Runnable { private Resource r; Xiaoshou(Resource r) { this.r=r; } public void run() { while(true) { try{Thread.sleep(150);}catch(InterruptedException e){} r.out(); } } }