博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生产者--消费者模式
阅读量:6658 次
发布时间:2019-06-25

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

生产者--消费者模式

1、示例:

class Resource{	private String name;	private int count = 1;	private Boolean flag = false;		public synchronized void set(String name){		if(flag)			try {				this.wait();//this代表调用函数线程			} catch (InterruptedException e) {}				this.name = name+"__ " + count++;		System.out.println(Thread.currentThread().getName()+ "......生产者" + this.name);		flag = true;		this.notifyAll();	}		public synchronized void show(){		if(!flag)			try {				this.wait();			} catch (InterruptedException e) {			}				System.out.println(Thread.currentThread().getName()+"消费者"+ this.name);		flag = false;		this.notifyAll();	}}//定义生产类Producter,生产商品class Producter implements Runnable{	private Resource r;	Producter(Resource r){		this.r = r;	}	public void run(){		while(true){			r.set("商品");		}	}}//定义消费者类Customer,消费商品class Customer implements Runnable{	private Resource r;	Customer(Resource r){		this.r = r;	}	public void run(){		while(true){			r.show();		}	}}

分析: 

  • 多个生产者、消费者定义使用while判断标记

    原因:让被唤醒的线程再次判断标记

  • 定义中使用notifyAll

    原因: 因为需要唤醒对方线程,如果使用notify容易出现值唤醒本方线程的情况,导致线程中所有线程都处于等待状态

 

2.JDK5中提供多线程解决方案

  • 将同步synchronized替换成lock操作
  • 将object中的wait/notify/notifyALl替换成condtion对象
  • 该对象可以通过lock锁进行获取

 

示例:

 

 

package unit18;import java.util.concurrent.locks.*;class Resources{	private String name;	private int count = 1;	private Boolean flag = false;		private Lock lock = new ReentrantLock();//定义Lock类		private Condition condition_pro = lock.newCondition();	private Condition condition_con = lock.newCondition();		public  void set(String name)throws InterruptedException{		lock.lock();//添加锁		try{		while(flag){			condition_pro.wait();//生产者调用线程等待		  }		this.name = name+"__ " + count++;		System.out.println(Thread.currentThread().getName()+ "......生产者" + this.name);		flag = true;		condition_pro.signal();	//唤醒消费者线程		}catch(Exception e){}		finally{			lock.unlock();//解锁		}	}		public synchronized void show()throws InterruptedException{		lock.lock();		try{		while(!flag){			condition_con.wait();		}				System.out.println(Thread.currentThread().getName()+"消费者"+ this.name);		flag = false;		condition_con.signal();//唤醒生产者线程		}catch(Exception e){}		finally{			lock.unlock();		}	}}class Producters implements Runnable{	private Resources r;	Producters(Resources r){		this.r = r;	}	public void run(){		while(true){			try {				r.set("商品");			} catch (InterruptedException e) {						}		}	}}class Customers implements Runnable{	private Resources r;	Customers(Resources r){		this.r = r;	}	public void run(){		while(true){			try {				r.show();			} catch (InterruptedException e) {						}		}	}}public class ProducterCustomerTest2 {	public static void main(String[] args) {		Resources r = new Resources();		Producters pro = new Producters(r);		Customers cus = new Customers(r);		Thread t1 = new Thread(pro);//		Thread t2 = new Thread(pro);//		Thread t3 = new Thread(cus);		Thread t2 = new Thread(cus);		t1.start();//		t2.start();//		t3.start();		t2.start();	}}

  

 

转载于:https://www.cnblogs.com/chizhongyue/p/4606074.html

你可能感兴趣的文章
涉密数据的处理
查看>>
python简介
查看>>
python字典开发三级菜单
查看>>
.net Framework下载地址
查看>>
深圳偶遇
查看>>
如何有效地记录 Java SQL 日志?
查看>>
学习Linux决心书
查看>>
Java本地文件操作(五)遍历文件夹
查看>>
BGP学习笔记
查看>>
linux 磁盘分区(一)
查看>>
在虚拟机中的域环境下批量安装部署软件(第三节)
查看>>
java基础(jdbc上)
查看>>
python文件读写,以后就用with open语句
查看>>
自然语言处理NLP(三)
查看>>
苏州大学GCT
查看>>
go语言碎片整理之 time
查看>>
spring mvc 返回json 数据
查看>>
我的友情链接
查看>>
SUSE下nx nomachine安装配置
查看>>
精通脚本***学习笔记(二)
查看>>