142_多线程-线程间通信

/*
线程间通讯:
其实就是多线程在操作同一个资源。
但是操作的动作不同
*/

class Res{
	String name;
	String sex;
}

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.name = "mike";
				r.sex = "man";
			}
			else{
				r.name = "哈哈";
				r.sex = "女";
			}
			x = (x+1)%2;
		}
	}
}

class Output implements Runnable{
	private Res r;
	Output(Res r){
		this.r = r;
	}
	public void run(){
		while(true){
			System.out.println(r.name+"--"+r.sex);
		}
	}
}

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

运行结果:
哈哈--man
mike--女
mike--女
mike--女
哈哈--女
mike--女
哈哈--女
mike--女
哈哈--man
哈哈--man
哈哈--man
mike--女
哈哈--女
mike--man
mike--man
mike--man
mike--man
哈哈--女
哈哈--女
————————————————————————————————————
产生该结果原因在于:
两个线程共同操作name和sex,会出现情况是,线程input还没赋值完,output就已经将
变量值输出了。

操作共同资源的代码为
while(true){
			if(x==0){
				r.name = "mike";
				r.sex = "man";
			}
			else{
				r.name = "哈哈";
				r.sex = "女";
			}
			x = (x+1)%2;
			
		}

while(true){
	       System.out.println(r.name+"--"+r.sex);
}


要加上同步。因为当前代码中,只有r对象是唯一的,所以以r为synchronized传递的对象。
/*
线程间通讯:
其实就是多线程在操作同一个资源。
但是操作的动作不同
*/

class Res{
	String name;
	String sex;
}

class Input implements Runnable{
	private Res r;

	Input(Res r){
		this.r = r;
	}
	public void run(){
		int x = 0;
		while(true){
			synchronized(r){
				if(x==0){
					r.name = "mike";
					r.sex = "man";
				}
				else{
					r.name = "哈哈";
					r.sex = "女";
				}
				x = (x+1)%2;
			}
		}
	}
}

class Output implements Runnable{
	private Res r;
	Output(Res r){
		this.r = r;
	}
	public void run(){
		while(true){
			synchronized(r){
				System.out.println(r.name+"--"+r.sex);
			}
		}
	}
}

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

你可能感兴趣的:(java)