java多线程--ReentrantLock实现生产者与消费者模式

翻译 2017年03月26日 21:25:07


一.本例实现 :一对一交替打印,

一.生产者逻辑 :每次只允许一个生产者来进行生产操作(生产者之间互斥访问仓库),必须等消费者取走数据之后,才能进行下一次的生产

二.消费者逻辑 :每次只允许一个消费者来进行生产操作(消费者之间互斥访问仓库),必须等生产者生产数据之后,才能进行下一次的消费。


二.仓库类:

package lock.produce.comsumer;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class MyService {
	
	private ReentrantLock lock = new ReentrantLock();
	
	private Condition condition = lock.newCondition();
	
	private boolean hasValue = false;
	
	
	/**
	 * 生产数据
	 */
	public void set(){
		
		try {
			lock.lock();      //获取监视器对象,即获取锁
			
			while(hasValue){
				condition.await();
			}
			
			System.out.println("打印*");
			hasValue = true;		//只允许当前一个线程进来,且是消费线程进来
			condition.signal();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
	
	
	/**
	 * 消费数据
	 */
	public void get(){
		try {
			lock.lock();      //获取监视器对象,即获取锁
			
			while(!hasValue){
				condition.await();
			}
			
			System.out.println("打印&");
			hasValue = false;		//只允许当前一个线程进来,且是生产者线程进来
			condition.signal();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}

}


三.生产者:

package lock.produce.comsumer;


/**
 * 生产者线程
 * @author Administrator
 *
 */
public class MyThreadA extends Thread{
	
	private MyService myService;
	
	public MyThreadA(MyService myService){
		this.myService = myService;
	}
	
	public void run(){
		
		for(int i=0;i<5;i++){
			myService.set();
		}
	}

}


四.消费者类:

package lock.produce.comsumer;

public class MyThreadB extends Thread{

/**
 * 消费者线程
 */
private MyService myService;
	
	public MyThreadB(MyService myService){
		this.myService = myService;
	}
	
	public void run(){
		
		for(int i=0;i<5;i++){
			myService.get();
		}
	}

}


五。测试类:

package lock.produce.comsumer;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		MyService myService = new MyService();
		
		MyThreadA a = new MyThreadA(myService);
		a.start();
		
		
		MyThreadB b = new MyThreadB(myService);
		b.start();
		
	}

}



六。测试结果:

打印*
打印&
打印*
打印&
打印*
打印&
打印*
打印&
打印*
打印&





Java并发之ReentrantLock详解

一、入题        ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为: ReentrantLock takeLock = n...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016年08月08日 21:03
  • 10235

Java多线程同步(锁)的实现方法(synchronised 与reentrantlock)

synchronised synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{...
  • Evan123mg
  • Evan123mg
  • 2016年11月04日 12:02
  • 1009

使用ReentrantLock和Condition实现生产者消费者模型

使用ReentrantLock和Condition实现【生产者-消费者】。/** * @author wzx * @time 2017/5/8 */ public class ProducerC...
  • wang704987562
  • wang704987562
  • 2017年05月08日 18:27
  • 212

使用Lock来实现生产者和消费者问题

Lock的await/singal 和 Object的wait/notify 的区别 在使用Lock之前,我们都使用Object 的wait和notify实现同步的。举例来说,一个producer和...
  • lingzhm
  • lingzhm
  • 2015年08月22日 21:54
  • 1780

java多线程之生产消费模式

/*@author shijin  * 生产者与消费者模型中,要保证以下几点:  * 1 同一时间内只能有一个生产者生产     生产方法加锁sychronized  * 2 同一时间内只能有一...
  • BloodyDmusic
  • BloodyDmusic
  • 2016年07月22日 13:01
  • 877

java 多线程并发系列之 生产者消费者模式的两种实现

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。 真实世界中的生产者消费者模式...
  • yujin753
  • yujin753
  • 2015年05月14日 16:59
  • 11825

Java线程(三):线程协作-生产者/消费者问题

上一篇:Java线程(二)         上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者模式是一个经典的线程同步以及通信的模型。  ...
  • ghsau
  • ghsau
  • 2012年04月06日 22:46
  • 37832

java多线程之生产者消费者经典问题

今天研究了一下java多线程,顺便写了一下多线程中的经典问题-----生产者消费者经典问题,参照了网上的各种写法之后自己写了一个,如下所示 /**生产者消费者问题,涉及到几个类 * 第一,这个...
  • thinkpadshi
  • thinkpadshi
  • 2012年11月08日 19:59
  • 51743

Java多线程-Lock锁的使用,以及生产者和消费者的实现

本文中将主要介绍Java多线程编程基础中的Lock锁对象的使用,以及如何一步一步实现Java代码的生产者与消费者; 1、Java中如何使用Lock锁以及死锁问题的描述 2、Java实现生产者...
  • yangqian201175
  • yangqian201175
  • 2016年05月07日 14:43
  • 2014

Java多线程--生产者消费者模型(Semaphore实现)

需求要求:使用2个线程,分别代表:生产者、消费者。让他们并发的去生产、消费产品。生产的总数是不能超过N的。实现思路这里我们使用的是使用信号量去控制线程的生产消费,通过释放令牌的形式去控制生产者消费者的...
  • qq_24489717
  • qq_24489717
  • 2017年04月12日 21:53
  • 830
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java多线程--ReentrantLock实现生产者与消费者模式
举报原因:
原因补充:

(最多只允许输入30个字)