`
qq466862016
  • 浏览: 128202 次
  • 来自: 杭州
社区版块
存档分类
最新评论

java多线程之生产者与消费者模型2

 
阅读更多

java多线程之生产者与消费者模型2

在java5中加入了并发包,里面有很多有关并发相关的工具类,其中Lock 就是实现提供比使用synchronized方法和代码块获得更加广泛的锁定操作。这样会有更加灵活的结构,可以具有差别很大的属性,可以支持多个Condition对象。那么什么是Condition是什么呢?Condition是将Object监视器方法 wait、notify、notifyAll 分解成截然不同的对象,以便通过这些对象与Lock实现组合使用。那我们可以看出 Lock 代替了 synchronized 方法和代码块的使用,Condition代替了Object监视器方法的使用。在使用Condition的实例的时候会被绑定到一个锁上 ,所有我们要为特定的Lock获取Condition实例,我们使用Lock.newCondition 方法获取Condition。Condition的方法 await 造成当前线程在接到singal 或者singnalAll方法唤醒之前或一直处于等待状态。

在大多数我们使用锁的时候应该使用一下格式:

   Lock l = ...; 
     l.lock();
     try {
         // access the resource protected by this lock
     } finally {
         l.unlock();
     }
 

 具体使用方法请看案例:

package java5.lock;

import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;



public class LockTest {

	private static Lock lock = new ReentrantLock();
	private static Condition isFullCondition = lock.newCondition();
	private static Condition isEmptyCondition = lock.newCondition();
	private static  Queue<Apple>  queue = new LinkedBlockingQueue<LockTest.Apple>();
	
	private static class Apple {
		
		private String name;

		public Apple(String name) {
			super();
			this.name = name;
		}

		@Override
		public String toString() {
			return "Apple [name=" + name + "]";
		}
		
		
	}
	/**
	 * 消费者
	 * @author gaoyuandong
	 * @date   2015年7月24日 下午10:14:44
	 * @mail   466862016@qq.com
	 */
	private static class Customer extends Thread {
		
		@Override
		public void run() {
			
			while (true) {
				
				lock.lock();
				try {
					if (queue.size() <=0) {
					 System.err.println(Thread.currentThread().getName() +" 我饿,没有东西吃了,我等待...");
						isEmptyCondition.await();
					}
					queue.poll();
					System.err.println( Thread.currentThread().getName() +" 我吃了一个苹果 还剩下" +queue.size() +"个苹果");
					isFullCondition.signalAll();
					
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally{
					lock.unlock();
				}
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 生产者
	 * @author gaoyuandong
	 * @date   2015年7月24日 下午10:13:53
	 * @mail   466862016@qq.com
	 */
	private static class Producer extends Thread {
		
		@Override
		public void run() {
			
			while (true) {
				
				lock.lock();
				
				try {
					
					if(queue.size() >= 30) {
						System.err.println(Thread.currentThread().getName() +" 我是生产者,我生产够了苹果。我要等待....");
						isFullCondition.await();
					}
					
					queue.add(new Apple("xx"));
					System.err.println(Thread.currentThread().getName() +" 我是生产者,我新生产一个苹果 现在共有" + queue.size() +"个苹果");
					
					isEmptyCondition.signalAll();
				} catch (Exception e) {
					// TODO: handle exception
				}finally {
					lock.unlock();
				}
				
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void main(String[] args) {
		
		Producer producer = new Producer();
		producer.start();
		
		for (int i = 0; i < 10; i++) {
			
			Customer customer = new Customer();
			customer.start();
		}
	}
}

 输出结果:

Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-2 我吃了一个苹果 还剩下0个苹果
Thread-3 我饿,没有东西吃了,我等待...
Thread-1 我饿,没有东西吃了,我等待...
Thread-4 我饿,没有东西吃了,我等待...
Thread-6 我饿,没有东西吃了,我等待...
Thread-5 我饿,没有东西吃了,我等待...
Thread-7 我饿,没有东西吃了,我等待...
Thread-8 我饿,没有东西吃了,我等待...
Thread-9 我饿,没有东西吃了,我等待...
Thread-10 我饿,没有东西吃了,我等待...
Thread-2 我饿,没有东西吃了,我等待...
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-3 我吃了一个苹果 还剩下0个苹果
Thread-1 我吃了一个苹果 还剩下0个苹果
Thread-4 我吃了一个苹果 还剩下0个苹果
Thread-6 我吃了一个苹果 还剩下0个苹果
Thread-5 我吃了一个苹果 还剩下0个苹果
Thread-7 我吃了一个苹果 还剩下0个苹果
Thread-8 我吃了一个苹果 还剩下0个苹果
Thread-9 我吃了一个苹果 还剩下0个苹果
Thread-10 我吃了一个苹果 还剩下0个苹果
Thread-2 我吃了一个苹果 还剩下0个苹果
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-9 我吃了一个苹果 还剩下0个苹果
Thread-6 我饿,没有东西吃了,我等待...
Thread-7 我饿,没有东西吃了,我等待...
Thread-2 我饿,没有东西吃了,我等待...
Thread-3 我饿,没有东西吃了,我等待...
Thread-10 我饿,没有东西吃了,我等待...
Thread-1 我饿,没有东西吃了,我等待...
Thread-4 我饿,没有东西吃了,我等待...
Thread-5 我饿,没有东西吃了,我等待...
Thread-8 我饿,没有东西吃了,我等待...
Thread-9 我饿,没有东西吃了,我等待...
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-6 我吃了一个苹果 还剩下0个苹果
Thread-7 我吃了一个苹果 还剩下0个苹果
Thread-2 我吃了一个苹果 还剩下0个苹果
Thread-3 我吃了一个苹果 还剩下0个苹果
Thread-10 我吃了一个苹果 还剩下0个苹果
Thread-1 我吃了一个苹果 还剩下0个苹果
Thread-4 我吃了一个苹果 还剩下0个苹果
Thread-5 我吃了一个苹果 还剩下0个苹果
Thread-8 我吃了一个苹果 还剩下0个苹果
Thread-9 我吃了一个苹果 还剩下0个苹果
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-9 我吃了一个苹果 还剩下0个苹果
Thread-7 我饿,没有东西吃了,我等待...
Thread-3 我饿,没有东西吃了,我等待...
Thread-6 我饿,没有东西吃了,我等待...
Thread-2 我饿,没有东西吃了,我等待...
Thread-10 我饿,没有东西吃了,我等待...
Thread-5 我饿,没有东西吃了,我等待...
Thread-1 我饿,没有东西吃了,我等待...
Thread-4 我饿,没有东西吃了,我等待...
Thread-8 我饿,没有东西吃了,我等待...
Thread-9 我饿,没有东西吃了,我等待...
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-7 我吃了一个苹果 还剩下0个苹果
Thread-3 我吃了一个苹果 还剩下0个苹果
Thread-6 我吃了一个苹果 还剩下0个苹果
Thread-2 我吃了一个苹果 还剩下0个苹果
Thread-10 我吃了一个苹果 还剩下0个苹果
Thread-5 我吃了一个苹果 还剩下0个苹果
Thread-1 我吃了一个苹果 还剩下0个苹果
Thread-4 我吃了一个苹果 还剩下0个苹果
Thread-8 我吃了一个苹果 还剩下0个苹果
Thread-9 我吃了一个苹果 还剩下0个苹果
Thread-5 我饿,没有东西吃了,我等待...
Thread-1 我饿,没有东西吃了,我等待...
Thread-4 我饿,没有东西吃了,我等待...
Thread-8 我饿,没有东西吃了,我等待...
Thread-7 我饿,没有东西吃了,我等待...
Thread-3 我饿,没有东西吃了,我等待...
Thread-6 我饿,没有东西吃了,我等待...
Thread-2 我饿,没有东西吃了,我等待...
Thread-10 我饿,没有东西吃了,我等待...
Thread-9 我饿,没有东西吃了,我等待...
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-5 我吃了一个苹果 还剩下0个苹果
Thread-1 我吃了一个苹果 还剩下0个苹果
Thread-4 我吃了一个苹果 还剩下0个苹果
Thread-8 我吃了一个苹果 还剩下0个苹果
Thread-7 我吃了一个苹果 还剩下0个苹果
Thread-3 我吃了一个苹果 还剩下0个苹果
Thread-6 我吃了一个苹果 还剩下0个苹果
Thread-2 我吃了一个苹果 还剩下0个苹果
Thread-10 我吃了一个苹果 还剩下0个苹果
Thread-9 我吃了一个苹果 还剩下0个苹果
Thread-7 我饿,没有东西吃了,我等待...
Thread-5 我饿,没有东西吃了,我等待...
Thread-4 我饿,没有东西吃了,我等待...
Thread-0 我是生产者,我新生产一个苹果 现在共有1个苹果
Thread-1 我吃了一个苹果 还剩下0个苹果
Thread-8 我饿,没有东西吃了,我等待...
Thread-9 我饿,没有东西吃了,我等待...
Thread-6 我饿,没有东西吃了,我等待...
Thread-10 我饿,没有东西吃了,我等待...
Thread-3 我饿,没有东西吃了,我等待...
Thread-2 我饿,没有东西吃了,我等待...
Thread-7 我吃了一个苹果 还剩下0个苹果
Thread-5 我吃了一个苹果 还剩下0个苹果
Thread-4 我吃了一个苹果 还剩下0个苹果

 

分享到:
评论

相关推荐

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

    java多线程实现生产者和消费者

    9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    java多线程(生产者与消费者)

    总结来说,“java多线程(生产者与消费者)”是关于如何在Java中使用同步、线程间通信和共享资源来实现高效且安全的并发编程。通过理解并熟练应用这些概念和工具,开发者可以构建出能够充分利用多核处理器能力的高...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

    java多线程实现生产者消费者关系

    在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

    由生产者/消费者问题看JAVA多线程

    ### 由生产者/消费者问题深入理解JAVA多线程 #### 生产者/消费者问题概述 生产者/消费者问题是一个经典的计算机科学问题,用于展示进程间的通信与同步问题。在这个模型中,生产者负责创建数据并将其放置到共享内存...

    Java多线程-生产者与消费者问题

    ### Java多线程-生产者与消费者问题 #### 一、生产者与消费者问题概览 **1.1 概要** 生产者与消费者问题是计算机科学中一个多线程同步的经典问题。它描述了两个线程如何共享有限资源的场景:一个是生产者...

    java 多线程之生产者与消费者

    Java多线程中的“生产者与消费者”模式是一种经典的并发编程模型,用于解决资源的生产与消费问题。在这个模式中,生产者线程负责创建或生成数据,而消费者线程则负责处理或消耗这些数据。这种模式充分利用了系统资源...

    JAVA多线程之生产者消费者模型.docx

    生产者消费者模型是多线程编程中的一个经典设计模式,主要用来解决生产者(生产数据的线程)和消费者(消费数据的线程)之间的同步和通信问题。在这个模型中,生产者生产产品并将其放入一个共享的容器,而消费者则从...

    java线程安全以及生产者消费者demo

    Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    生产者和消费者模式多线程

    生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...

    多线程模拟实现生产者/消费者模型

    生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    多线程_生产者与消费者模式示例

    在描述中提到的链接(),博主分享了一个关于多线程生产者与消费者模式的具体实现案例。虽然具体代码没有给出,但我们可以根据常见的实现方式来解析这个模式。 1. **共享数据结构**:在这个模式中,通常会有一个...

Global site tag (gtag.js) - Google Analytics