/*
线程间通讯:
其实就是多个线程在操作同一个资源,
但是操作的动作不同。
*/classRes{
String name;
String sex;boolean flag =false;}classInputimplementsRunnable{private Res r ;Input(Res r){this.r = r;}publicvoidrun(){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();}}}}classOutputimplementsRunnable{private Res r ;Output(Res r){this.r = r;}publicvoidrun(){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();}}}}classInputOutputDemo{publicstaticvoidmain(String[] args){
Res r =newRes();
Input in =newInput(r);
Output out =newOutput(r);
Thread t1 =newThread(in);
Thread t2 =newThread(out);
t1.start();
t2.start();}}//notifyAll();/*
wait:
notify();
notifyAll();
都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义Object类中呢?
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁,
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中。
*/
代码优化
/*
线程间通讯:
其实就是多个线程在操作同一个资源,
但是操作的动作不同。
*/classRes{private String name;private String sex;privateboolean flag =false;publicsynchronizedvoidset(String name,String sex){if(flag)try{this.wait();}catch(Exception e){}this.name = name;this.sex = sex;
flag =true;this.notify();}publicsynchronizedvoidout(){if(!flag)try{this.wait();}catch(Exception e){}
System.out.println(name+"........"+sex);
flag =false;this.notify();}}classInputimplementsRunnable{private Res r ;Input(Res r){this.r = r;}publicvoidrun(){int x =0;while(true){if(x==0)
r.set("mike","man");else
r.set("丽丽","女女女女女");
x =(x+1)%2;}}}classOutputimplementsRunnable{private Res r ;Output(Res r){this.r = r;}publicvoidrun(){while(true){
r.out();}}}classInputOutputDemo2{publicstaticvoidmain(String[] args){
Res r =newRes();newThread(newInput(r)).start();newThread(newOutput(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();
*/}}