博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程2
阅读量:5971 次
发布时间:2019-06-19

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

多线程之间的通信,等待唤醒机制

概念:多个线程,不同的任务,处理同一资源。

多生产者,多消费者的问题。

if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。
while判断标记,解决了线程获取执行权后,是否要运行!

notify:只能唤醒一个线程,如果本方唤醒了本方,没有意义。而且while判断标记+notify会导致死锁。

notifyAll解决了本方线程一定会唤醒对方线程的问题。

class Resource{	private String name;	private int count = 1;	private boolean flag = false;	public synchronized void set(String name)	{		while(flag)			try{this.wait();}catch(InterruptedException e){}				this.name = name + count;		count++;//2 3 4		System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);		flag = true;		notifyAll();	}	public synchronized void out()	{		while(!flag)			try{this.wait();}catch(InterruptedException e){}			System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);		flag = false;		notifyAll();	}}class Producer implements Runnable{	private Resource r;	Producer(Resource r)	{		this.r = r;	}	public void run()	{		while(true)		{			r.set("烤鸭");		}	}}class Consumer implements Runnable{	private Resource r;	Consumer(Resource r)	{		this.r = r;	}	public void run()	{		while(true)		{			r.out();		}	}}
JDK1.5以后出现了更好的方案,Lock接口替代了synchronized  ,Condition接口替代了Object中的监视方法,并将监视器方法封装成了Condition。和以前不同的是,以前一个锁上只能有一组监视器方法。现在,一个Lock锁上可以多组监视器方法对象。可以实现一组负责生产者,一组负责消费者

import java.util.concurrent.locks.*;class Resource{	private String name;	private int count = 1;	private boolean flag = false;//	创建一个锁对象。	Lock lock = new ReentrantLock();	//通过已有的锁获取该锁上的监视器对象。//	Condition con = lock.newCondition();	//通过已有的锁获取两组监视器,一组监视生产者,一组监视消费者。	Condition producer_con = lock.newCondition();	Condition consumer_con = lock.newCondition();		public  void set(String name)//  t0 t1	{		lock.lock();		try		{			while(flag)//			try{lock.wait();}catch(InterruptedException e){}			try{producer_con.await();}catch(InterruptedException e){}					this.name = name + count;			count++;//2 3 4			System.out.println(Thread.currentThread().getName()+"...生产者5.0..."+this.name);			flag = true;			consumer_con.signal();		}		finally		{			lock.unlock();		}			}	public  void out()// t2 t3	{		lock.lock();		try		{			while(!flag)			try{cousumer_con.await();}catch(InterruptedException e){}				System.out.println(Thread.currentThread().getName()+"...消费者.5.0......."+this.name);			flag = false;			producer_con.signal();		}		finally		{			lock.unlock();		}			}}class Producer implements Runnable{	private Resource r;	Producer(Resource r)	{		this.r = r;	}	public void run()	{		while(true)		{			r.set("烤鸭");		}	}}class Consumer implements Runnable{	private Resource r;	Consumer(Resource r)	{		this.r = r;	}	public void run()	{		while(true)		{			r.out();		}	}}

转载于:https://www.cnblogs.com/myeden/p/6218284.html

你可能感兴趣的文章
Asterisk 安装与配置
查看>>
SQL2008-中不想插入从复记录
查看>>
.Net基础
查看>>
AES加密算法原理
查看>>
《Programming WPF》翻译 第8章 4.关键帧动画
查看>>
iOS UI基础-16.0 UIButton
查看>>
屏蔽各大视频网站播放前15秒30秒广告
查看>>
进入TP-Link路由器之后利用快捷键F12查看星号路由密码的方法
查看>>
linux内核的oops
查看>>
iOS - OC 语言新特性
查看>>
基于Token的WEB后台认证机制
查看>>
jinfo_动态调整JVM参数(无需重启)(实践)
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 2
查看>>
uiimageview 异步加载图片
查看>>
屏幕录像专家注册机破解方法
查看>>
SPIE Example References
查看>>
2015阿里巴巴秋招在线笔试题
查看>>
前缀式计算(前缀表达式)
查看>>
poj2728 Desert King --- 01分数规划 二分水果。。
查看>>
iOS边练边学--介绍布局的三种方法
查看>>