`
leihongtai2010
  • 浏览: 14955 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java线程中典型的生产者与消费者模式

阅读更多
模型描述:
    java线程中典型的生产者与消费者模式,综合运用到thread中的notify()和wait();
仓库Godown的固定的容量大小max_size,同时有多个生产者向仓库生产放他产品,同时又有多个消费都从仓库取出产品,这就涉及到生产和消费过程中的同步问题,利用多线程技术可以很好的解决这个问题

1、生产者模型,定义为一个线程即实现Thread类
package com.leiht.thread.waitnotify;

public class Producer extends Thread {
	
	private int needNum;
	private Godown godown;
	
	public Producer(int needNum, Godown godown) {
		this.needNum = needNum;
		this.godown = godown;
	}
	

	@Override
	public void run() {
		godown.produce(needNum);
	}
	

	public int getNeedNum() {
		return needNum;
	}

	public void setNeedNum(int needNum) {
		this.needNum = needNum;
	}

	public Godown getGodown() {
		return godown;
	}

	public void setGodown(Godown godown) {
		this.godown = godown;
	}

}

2、消费模型
package com.leiht.thread.waitnotify;

public class Consumer extends Thread {
	
	private int needNum;
	private Godown godown;
	
	public Consumer(int needNum, Godown godown) {
		this.needNum = needNum;
		this.godown = godown;
	}
	
	@Override
	public void run() {
		godown.consume(needNum);
	}
	
	
	public int getNeedNum() {
		return needNum;
	}

	public void setNeedNum(int needNum) {
		this.needNum = needNum;
	}

	public Godown getGodown() {
		return godown;
	}

	public void setGodown(Godown godown) {
		this.godown = godown;
	}
	
}


仓库模型(核心代码)
package com.leiht.thread.waitnotify;

public class Godown {

	public int current_size;
	public static final int max_size = 100;

	public static int getMaxSize() {
		return max_size;
	}
	
	public Godown(int current_size) {
		this.current_size = current_size;
	}
	
	/*
	 * 生产方法
	 */
	public synchronized void produce(int needNum) {
		//可以生产
		if((needNum + current_size) < max_size) { 
			System.out.println("开始生产");
			current_size = current_size + needNum;
			System.out.println("生产完成");
			notifyAll();
			
		}else { //不能生产 将当前线程挂到this(当前)对象上
			try {
				System.out.println("当前库存过大,挂起等待");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	/*
	 * 消费方法
	 */
	public synchronized void consume(int needNum) {
		
		if(needNum > current_size) {
			try {
				System.out.println("当前商品不足,等等待");
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("开始消费");
		current_size = current_size - needNum;
		System.out.println("结束消费");
		notifyAll();
		
	}

}


测试代码
package com.leiht.thread.waitnotify;

public class Test  {
	public static void main(String[] args) {
		Godown godown = new Godown(30);
		Consumer c1 = new Consumer(50, godown);
		Consumer c2 = new Consumer(20, godown);
		Consumer c3 = new Consumer(30, godown);
		Producer p1 = new Producer(10, godown);
		Producer p2 = new Producer(10, godown);
		Producer p3 = new Producer(10, godown);
		Producer p4 = new Producer(10, godown);
		Producer p5 = new Producer(10, godown);
		Producer p6 = new Producer(10, godown);
		Producer p7 = new Producer(80, godown);
		c1.start();
		c2.start();
		c3.start();
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
	}
}
5
0
分享到:
评论
1 楼 sql_861365880 2015-11-02  
        

相关推荐

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

    通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。

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

    在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...

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

    4. **阻塞队列(BlockingQueue)**:Java并发包(java.util.concurrent)中的阻塞队列是实现生产者消费者模式的理想选择。它们在内部已经处理了线程同步和等待,提供了一种高效且安全的共享数据方式。例如,`put()`...

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

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

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

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

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

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

    java线程实现的生产者和消费者的程序

    在Java中,我们可以利用`java.util.concurrent`包中的工具类来实现生产者消费者模式。其中,`BlockingQueue`接口是一个理想的候选,因为它提供了线程安全的数据结构,可以用于线程间的同步。`BlockingQueue`有多种...

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

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

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

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...

    Java 生产者消费者模式

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

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

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

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

    线程池可以配合生产者消费者模式,例如通过提交任务到线程池来实现生产者,线程池中的工作线程充当消费者角色。 在使用生产者消费者模式时,需要注意以下几点: - **线程安全**:确保所有的操作都是线程安全的,...

    多线程中的生产者与消费者问题

    本例通过Java语言实现了生产者-消费者模式的一个简单示例。具体代码如下: 1. **主类** `ProducerConsumer`:负责初始化存储器、生产者和消费者对象,并启动对应的线程。 - `Storage s = new Storage();`:创建一...

    java多线程例子-生产者消费者

    通过这个示例,我们不仅了解了生产者消费者模式,还学习了Java并发编程中`BlockingQueue`接口的使用,以及如何创建和管理线程。这是一个基础但非常实用的例子,有助于理解多线程环境中的同步和协作。在实际应用中,...

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

    Java多线程中的“生产者与消费者”模式是一种...在实际开发中,可以利用Java提供的并发工具类,如`Semaphore`(信号量)、`CountDownLatch`(计数器)等,进一步优化和扩展生产者消费者模型,以适应更复杂的业务需求。

    java多线程之消费者生产者模式参照.pdf

    Java中的消费者生产者模式是一种经典的多线程设计模式,它用于解决两个或多个线程间的协同工作问题。在这个模式中,生产者线程负责创建资源,而消费者线程则负责消费这些资源。为了保证线程安全和有效协作,通常会...

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

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

    Java生产者与消费者

    在实际应用中,Java提供了更高级的并发工具类,如`BlockingQueue`,它已经内置了线程安全和阻塞操作,可以简化生产者与消费者模式的实现,提高代码的可读性和可维护性。例如,我们可以使用`ArrayBlockingQueue`作为...

    java生产者与消费者实验报告

    ### Java生产者与消费者模型详解 ...实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个生产者与三个消费者之间的数据同步交互,验证了生产者-消费者模式的有效性和可行性。

Global site tag (gtag.js) - Google Analytics