博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程间的通讯之等待唤醒机制
阅读量:6832 次
发布时间:2019-06-26

本文共 3894 字,大约阅读时间需要 12 分钟。

线程间的通讯:

事实上就是多个线程在操作同一个资源。
可是操作动作不同

 

样例:

需求:模拟简单卖票系统(输入一个人。紧接着输出一个人)

 

class Res{	String name;	String sex;}class Input  implements Runnable{	private Res r;	private int t=0;	Input(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			if(t==1)			{				r.name="nike";				r.sex="man";			}			else 			{				r.name="丽丽";				r.sex="女女";			}			t=(t+1)%2;		}	}}class Output  implements Runnable{	private Res r;	Output(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			System.out.println("output....."+r.name+"+++"+r.sex);		}	}}class InputOutputDemo{	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)

 

同步后

class Res{	String name;	String sex;}class Input  implements Runnable{	private Res r;	private int t=0;	Input(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			synchronized(Res.class)			{				if(t==1)				{					r.name="nike";					r.sex="man";				}				else 				{					r.name="丽丽";					r.sex="女女";				}				t=(t+1)%2;			}		}	}}class Output  implements Runnable{	private Res r;	Output(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			synchronized(Res.class)			{				System.out.println("output....."+r.name+"+++"+r.sex);			}		}	}}class InputOutputDemo2{	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();	}}

尽管安全 问题攻克了,但并没出现我们想要的一男一女交替的情景

 

 

这是就引进一种方法:等待唤醒机制

 

class Res{	String name;	String sex;	boolean flag;}class Input  implements Runnable{	private Res r;	private int t=0;	Input(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			synchronized(r)			{				if(r.flag)					try{r.wait();}catch(Exception e){}				if(t==1)				{					r.name="nike";					r.sex="man";				}				else 				{					r.name="丽丽";					r.sex="女女";				}				t=(t+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("output....."+r.name+"+++"+r.sex);				r.flag=false;				r.notify();			}		}	}}class InputOutputDemo3{	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;	public synchronized void  set(String name,String sex)	{		if(this.flag)		  try{this.wait();}catch(Exception e){}		this.name=name;		this.sex=sex;		this.flag=true;		  this.notify();	}	public synchronized void out()	{		if(!this.flag)		 try{this.wait();}catch(Exception e){}		System.out.println("output....."+this.name+"+++"+this.sex);		this.flag=false;				this.notify();	}}class Input  implements Runnable{	private Res r;	private int t=0;	Input(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			synchronized(r)			{				if(t==1)					r.set("nike","man");				else 					r.set("丽丽","女女女");				t=(t+1)%2;			}		}	}}class Output  implements Runnable{	private Res r;	Output(Res r)	{		this.r=r;	}	public void run()	{		while(true)		{			synchronized(r)			{				r.out();			}		}	}}class InputOutputDemo4{	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();		*/	}}

 

 

 

 

 

你可能感兴趣的文章
测试显示GitHub的Gist
查看>>
JavaScript学习——JavaScript基础
查看>>
JSP学习-07Cookie 与Session
查看>>
对对象使用[]的方式使用属性的一个例子的理解
查看>>
MS .NET企业级应用架构设计笔记1(关于业务层)
查看>>
【Codeforces Round #406 (Div. 2)】题解
查看>>
php基本语法
查看>>
页面加载顺序的问题
查看>>
防止人为误操作MySQL数据库技巧一例
查看>>
送给自己的春节回家最佳高薪充电技术
查看>>
用什么样的个人笔记类软件?OneNote、EverNote(印象笔记)、为知笔记、麦库记事、有道云笔记……...
查看>>
运维监控利器Nagios:概念、结构和功能
查看>>
《Python从小白到大牛》第7章 运算符
查看>>
C#中程序的退出
查看>>
MDT 2013 Update 1 Preview 部署 Windows 10之批量部署实战
查看>>
数据建模在性能测试中的理解
查看>>
离开网易的转型之路1:选择测试之路-路上的迷茫
查看>>
RHEL6入门系列之三十一,管理计划任务
查看>>
CentOS 用Strongswan搭建IPSec ***
查看>>
CentOS7 安装向导
查看>>