144_多线程(线程间通信-等待唤醒机制)

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

你可能感兴趣的:(java)