博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Lock Condition 实现产生者消费者
阅读量:6889 次
发布时间:2019-06-27

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

  hot3.png

一、Clerk2类:

package com.yao.thread.syn;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Clerk2 {	private int product = -1; //-1表示没有任何产品	private Lock lock = new ReentrantLock();	private Condition condition = lock.newCondition();		public void setProduct(int product){		try{			lock.lock();			while (this.product != -1) {				try {					condition.await();				} catch (InterruptedException e) {					throw new RuntimeException(e);				}			}			this.product = product;			System.out.printf("生产者设定 %d %n",this.product);			condition.signal();		}finally{			lock.unlock();		}			}		public int getProduct(){		try{			lock.lock();			while (this.product == -1) {				try {					condition.await();				} catch (InterruptedException e) {					throw new RuntimeException();				}			}			int temp = this.product;			System.out.printf("消费者取走 %d %n",temp);			this.product = -1;			condition.signal();			return temp;		}finally{			lock.unlock();		}	}}

二、Producter2类:

package com.yao.thread.syn;public class Producter2 implements Runnable {	private Clerk2 clerk;		public Producter2(Clerk2 clerk){		this.clerk = clerk;	}		@Override	public void run() {		System.out.println("生产者开始产生整数");		for (int i = 0 ; i < 10 ; i++) {			try {				Thread.sleep((int)(Math.random()*3000));			} catch (InterruptedException e) {				e.printStackTrace();			}			clerk.setProduct(i);		}	}}

三、Consumer2类:

package com.yao.thread.syn;public class Consumer2 implements Runnable {	private Clerk2 clerk;	public Consumer2(Clerk2 clerk){		this.clerk = clerk;	}	@Override	public void run() {		System.out.println("消费都可以消费整数");		for (int i = 0 ; i < 10 ; i++) {			try {				Thread.sleep((int)(Math.random()*3000));			} catch (InterruptedException e) {				e.printStackTrace();			}			clerk.getProduct();		}	}}

四、演示类:

package com.yao.thread.syn;public class ConsumerProducterDemo2 {	public static void main(String[] args) {		Clerk2 clerk2 = new Clerk2();		Consumer2 consumer = new Consumer2(clerk2);		Producter2 producter = new Producter2(clerk2);		new Thread(consumer).start();		new Thread(producter).start();	}}

这里的实现方式和传统的差不多一样,效率也差不多,只不过灵活许多。

转载于:https://my.oschina.net/jamaly/blog/309360

你可能感兴趣的文章
Win10下 80端口被system(pid=4)占用的解决方法
查看>>
使用SubVersion+TortoiseSVN多仓库方式进行版本控制
查看>>
Nginx虚拟目录alias和root目录
查看>>
MySQL(Extends)
查看>>
Android KeyboardView实现App内置键盘开发
查看>>
解决iOS因为网络卡顿点击button或者cell多次push的bug
查看>>
iOS-应用跳转
查看>>
怎么使用Vin码识别sdk/车架号识别sdk?
查看>>
实现许多图片编辑软件都支持的“填充颜色”功能
查看>>
鼠标点击后,所有div掉下来
查看>>
十二年IT职业生涯心得--致我们终将逝去的青春(连载)
查看>>
我的友情链接
查看>>
初学Redis(2)——用Redis作为Mysql数据库的缓存
查看>>
linux文档的压缩与打包
查看>>
百度贴吧爬虫程序
查看>>
SCDPM常见报错解答
查看>>
OA项目笔记
查看>>
引用计数 vs. GC
查看>>
jquery实用的一些方法
查看>>
质数方阵
查看>>