`

生产者消费者模式(一)

    博客分类:
  • JDK
 
阅读更多
需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓库可以存放10个产品。 第一批产品需要生产20个产品,并消费完毕。

结论: 当使用一个生产者,一个消费者是,需要4610,使用7个生产者,7个消费者时,只需要900,可见当N个任务耗时长,使用多线程可以充分发挥多核CPU的优点.
 package ycl.learn.effective.java.thread.pc;


/**
 * 公共资源类
 */
public class PublicResource {

	private int number = 0;
	
	private int index = 0;

	public static final int MAX_POOL = 10;
	
	public static final Product[] products = new Product[MAX_POOL];
 
	public static final int MAX_RESOURCE = 20;

	/**
	 * 增加公共资源
	 */
	public synchronized boolean increace() {
		if(isComplete()){//生产任务完成
			return false;
		}
		
		while (isFull()) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		} 
		number++;
		index++; 
		Product p = new Product(index);
		products[number-1]=p;
		notifyAll(); 
		System.out.println(Thread.currentThread()+"increace:" + index); 
		return true;
	}

	/**
	 * 减少公共资源
	 */
	public synchronized boolean decreace() { 
		while (isEmpty()) {
			try {
				if(isComplete()){//如果消费结束,将会死锁,因为isEmpty()is true forever, 所以不管你如何notify,他始终等待,添加当wait被notify时,消费任务完成,退出。
					return false;
				} 
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}  
		Product p =products[number-1];
		number--;
		notifyAll(); 
		System.out.println(Thread.currentThread()+"decreace:" + p.index); 
		return true;
	}

	/**
	 * 判断是否满了
	 */
	public  boolean isFull() {
		return number >= MAX_POOL;
	}

	/**
	 * 判断是否空了
	 */
	public  boolean isEmpty() {
		return number <= 0;
	}

	/**
	 * 判断生产完毕 
	 *  
	 */
	public  boolean isComplete() {
		return index >= MAX_RESOURCE;
	}
	
	class Product{
		public int index; 
		public Product(int index){
			this.index = index;
		}
	}
}



package ycl.learn.effective.java.thread.pc;

public class Productor implements Runnable {

	private PublicResource ps; 

	public Productor(PublicResource ps) {
		this.ps = ps;
	}

	public void run() { 
		while (true) {
			boolean flag = ps.increace();
			if(!flag){
				System.out.println(Thread.currentThread()+" exist");
				break;
			}
			try {
				Thread.sleep((int) (Math.random() * 500));
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
		}
	}
}



package ycl.learn.effective.java.thread.pc;

public class Customer implements Runnable {

	private PublicResource ps;

	public Customer(PublicResource ps) {
		this.ps = ps;
	}

	public void run() {
		while (true) { 
			boolean flag = ps.decreace(); 
			if(!flag){
				System.out.println(Thread.currentThread()+" exist");
				break;
			}
			try {
				Thread.sleep((int) (Math.random() * 500));
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
		}
	}

}


package ycl.learn.effective.java.thread.pc;

public class TestPC {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		one();
	}

	public static void one() throws InterruptedException{
		long start = System.currentTimeMillis();
		PublicResource ps = new PublicResource();
		Customer c = new Customer(ps);
		Productor p = new Productor(ps);
		Thread ct = new Thread(c,"customer0");
		Thread ct1 = new Thread(c,"customer1");
		Thread ct2 = new Thread(c,"customer2");
		Thread ct3 = new Thread(c,"customer3");
		Thread ct4 = new Thread(c,"customer4");
		Thread ct5 = new Thread(c,"customer5");
		Thread ct6 = new Thread(c,"customer6");
		
		Thread pt = new Thread(p,"productor0");
		Thread pt1 = new Thread(p,"productor1");
		Thread pt2 = new Thread(p,"productor2");
		Thread pt3 = new Thread(p,"productor3");
		Thread pt4 = new Thread(p,"productor4");
		Thread pt5 = new Thread(p,"productor5");
		Thread pt6 = new Thread(p,"productor6");
		ct.start();
		ct1.start();
		ct2.start();
		ct3.start();
		ct4.start();
		ct5.start();
		ct6.start();
		
		pt.start();
		pt1.start();
		pt2.start();
		pt3.start();
		pt4.start();
		pt5.start();
		pt6.start();
		 
		
		ct.join();
		ct1.join();
		ct2.join();
		ct3.join();
		ct4.join();
		ct5.join();
		ct6.join();
		
		pt.join();
		pt1.join();
		pt2.join();
		pt3.join();
		pt4.join();
		pt5.join();
		pt6.join();
		System.out.println(System.currentTimeMillis()-start);//4968
	}
}



Thread[productor0,5,main]increace:1
Thread[customer5,5,main]decreace:1
Thread[productor2,5,main]increace:2
Thread[customer0,5,main]decreace:2
Thread[productor0,5,main]increace:3
Thread[customer4,5,main]decreace:3
Thread[productor1,5,main]increace:4
Thread[productor4,5,main]increace:5
Thread[customer1,5,main]decreace:5
Thread[customer3,5,main]decreace:4
Thread[productor3,5,main]increace:6
Thread[customer6,5,main]decreace:6
Thread[productor6,5,main]increace:7
Thread[customer2,5,main]decreace:7
Thread[productor5,5,main]increace:8
Thread[customer6,5,main]decreace:8
Thread[productor2,5,main]increace:9
Thread[customer3,5,main]decreace:9
Thread[productor4,5,main]increace:10
Thread[customer4,5,main]decreace:10
Thread[productor6,5,main]increace:11
Thread[customer5,5,main]decreace:11
Thread[productor1,5,main]increace:12
Thread[customer0,5,main]decreace:12
Thread[productor1,5,main]increace:13
Thread[customer2,5,main]decreace:13
Thread[productor6,5,main]increace:14
Thread[customer3,5,main]decreace:14
Thread[productor1,5,main]increace:15
Thread[customer1,5,main]decreace:15
Thread[productor1,5,main]increace:16
Thread[customer2,5,main]decreace:16
Thread[productor5,5,main]increace:17
Thread[customer3,5,main]decreace:17
Thread[productor2,5,main]increace:18
Thread[customer4,5,main]decreace:18
Thread[productor0,5,main]increace:19
Thread[customer4,5,main]decreace:19
Thread[productor3,5,main]increace:20
Thread[productor5,5,main] exist
Thread[productor4,5,main] exist
Thread[customer6,5,main]decreace:20
Thread[productor1,5,main] exist
Thread[customer1,5,main] exist
Thread[customer5,5,main] exist
Thread[productor0,5,main] exist
Thread[customer0,5,main] exist
Thread[customer4,5,main] exist
Thread[productor6,5,main] exist
Thread[productor2,5,main] exist
Thread[customer6,5,main] exist
Thread[productor3,5,main] exist
Thread[customer2,5,main] exist
Thread[customer3,5,main] exist
875




  • 大小: 43.5 KB
分享到:
评论
2 楼 a123159521 2014-04-10  
putonyuer 写道
画图用了多长时间?》

what do you care?
1 楼 putonyuer 2014-04-07  
画图用了多长时间?》

相关推荐

    生产者 消费者 模式 c++

    生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...

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

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

    Qt C++11 生产者消费者模式类

    生产者消费者模式是一种多线程同步的经典设计模式,它在多线程编程中扮演着重要的角色,用于协调生产数据和消费数据的两个并发过程。在本项目“Qt C++11 生产者消费者模式类”中,我们看到利用Qt框架和C++11的新特性...

    labview 基于事件的生产者消费者模式

    labview 基于事件的生产者消费者模式

    架构设计 -- 生产者/消费者模式

    【生产者/消费者模式】是一种常见的并发编程和系统设计模式,它主要解决的是在多线程环境下,如何协调生产者和消费者之间的数据处理问题。在软件开发中,生产者通常是生成数据的一方,而消费者则是处理这些数据的...

    多进程同步-生产者消费者模式-C实现

    在这个场景下,我们关注的是一个经典的并发编程模型——生产者消费者模式。该模式是多进程同步的一种典型应用,通过它我们可以高效地管理数据的生产和消费。 生产者消费者模式基于操作系统提供的信号量(Semaphore...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    架构设计 生产者消费者模式

    生产者消费者模式的构建可以实现系统的高内聚和低耦合,这使得它成为软件开发中经常采用的一种设计方法。 生产者消费者模式的核心思想在于生产者和消费者之间的角色分离。在这个模式中,生产者的主要任务是生成数据...

    生产者与消费者模式

    【生产者与消费者模式】是一种经典的设计模式,它在解决多客户端与服务器之间的数据交换与传输问题上有着广泛的应用。该模式的核心思想是通过一个中间缓冲区,将生产数据的过程与消费数据的过程解耦,使得生产者可以...

    labview 生产者消费者例子

    7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...

    界面话模拟生产者消费者模式java

    生产者消费者模式是一种经典的多线程同步问题,用于在并发环境中协调生产者和消费者之间的数据处理。在这个模式中,生产者负责生成数据,而消费者则负责处理这些数据。Java提供了丰富的并发工具,如`BlockingQueue`...

    android 生产者消费者模式

    在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...

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

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    生产者消费者模式

    生产者消费者synchronized实现方式

    生产者消费者模式在java中的应用

    生产者消费者模式是一种经典的多线程同步问题解决方案,在Java中有着广泛的应用。它主要用于解决系统中数据处理的并发问题,确保生产者线程与消费者线程之间的协作与数据的有序处理。这种模式遵循一个基本原理:生产...

    多线程生产者消费者模式

    生产者消费者模式是一种经典的多线程设计模式,它用于协调两个或多个线程之间的数据交换,确保数据的正确生产和消费。 生产者消费者模式的核心思想是通过共享缓冲区来实现线程间的通信。生产者线程负责生成数据并放...

    Java多线程 生产者-消费者模式

    生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...

    redis 老版本生产者消费者模式

    在早期版本中,Redis 提供了一种基于队列的数据结构来实现生产者消费者模式,这是一种多线程或分布式系统中常见的设计模式,用于解耦数据生成(生产者)与数据处理(消费者)的过程。 生产者消费者模式在 Redis 中...

Global site tag (gtag.js) - Google Analytics