`
不平凡的人
  • 浏览: 35229 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

生产消费模式

 
阅读更多

1、生产者消费者模型

      经典的多线程模型;

      通常有两类线程:若干生产者线程,若干消费者线程;

      生产者线程:提交用户请求;

      消费者线程:处理生产者提交的任务,在生产和消费之间通过共享内存缓存区进行数据通信;

 

2、流程图



 

 

3、代码示例

(1)生产者

package net.oschina.tkj.mulitcoding.providerconsumermodel;

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/*
 * 生产消费模型中的生产者
 * 
 * 负责生成数据
 */
public class Provider implements Runnable {

	// 阻塞队列,存储任务数据,使用有界的高并发阻塞队列
	private final ArrayBlockingQueue<Data> queue;

	private static AtomicInteger count = new AtomicInteger(0);

	private final Random r = new Random();

	private boolean isRuning = true;

	public Provider(ArrayBlockingQueue<Data> queue) {
		this.queue = queue;
	}

	@Override
	public void run() {
		if (null == queue) {
			System.out.println("null point exception...");
			return;
		}
		Data d = null;
		while (isRuning) {

			d = new Data();
			d.setId(count.incrementAndGet());
			d.setName(r.nextInt() + " 数据");

			System.out.println("生产者线程:" + Thread.currentThread().getName()
					+ " 生产数据:id=" + d.getId() + "  数据=" + d.getName());

			try {
				if (!queue.offer(d, 2, TimeUnit.SECONDS)) {
					System.out.println("缓存数据的队列已满,等待队列中元素消费后再放入...");
				}
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

	public boolean stop() {
		isRuning = false;
		return isRuning;
	}

}

 

(2)消费者

package net.oschina.tkj.mulitcoding.providerconsumermodel;

import java.util.concurrent.ArrayBlockingQueue;

/**
 * 生产消费模型中的消费者
 * 
 * 消费数据
 * 
 * @author Freedom
 * 
 */
public class Consumer implements Runnable {

	private final ArrayBlockingQueue<Data> queue;

	public Consumer(ArrayBlockingQueue<Data> queue) {
		this.queue = queue;
	}

	private boolean run = true;

	@Override
	public void run() {

		if (null == queue) {
			System.out.println("queue is null,null point exception ...");
			return;
		}
		Data d = null;
		while (run) {
			try {
				if (0 != queue.size()) {
					// take方法为阻塞方法,如果队列为空则wait等待数据
					d = queue.take();

					System.out.println("当前线程消费数据:"
							+ Thread.currentThread().getName() + " 数据id="
							+ d.getId() + " 数据=" + d.getName());
				} else {
					// == 0
					run = false;
				}
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

 

(3)数据实体类

package net.oschina.tkj.mulitcoding.providerconsumermodel;

/**
 * 数据对象,供生产消费者使用
 * 
 * @author Freedom
 * 
 */
public class Data {

	private int id;
	private String name;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

(4)Main

package net.oschina.tkj.mulitcoding.providerconsumermodel;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Main {

	public static void main(String[] args) throws InterruptedException {

		ArrayBlockingQueue<Data> queue = new ArrayBlockingQueue<>(10); // 长度为10固定容量队列
		// 生产者
		Provider p1 = new Provider(queue);
		Provider p2 = new Provider(queue);
		Provider p3 = new Provider(queue);
		// 消费者
		Consumer c1 = new Consumer(queue);
		Consumer c2 = new Consumer(queue);
		Consumer c3 = new Consumer(queue);

		ExecutorService pool = Executors.newCachedThreadPool();
		pool.execute(p1);
		pool.execute(p2);
		pool.execute(p3);
		pool.execute(c1);
		pool.execute(c2);
		pool.execute(c3);

		TimeUnit.SECONDS.sleep(2);
		p1.stop();
		p2.stop();
		p3.stop();

		pool.shutdown();

	}

}

 

 

 

 

 

 

 

  • 大小: 86.8 KB
分享到:
评论

相关推荐

    生产消费模式应用之-使用中断队列实现的日志记录器

    在IT行业中,生产消费模式是一种常见的多线程处理机制,尤其在日志记录系统中有着广泛的应用。这个模式涉及到一个生产者(producer)不断地生成数据,而消费者(consumer)负责处理这些数据。在这个场景中,"使用...

    生产消费模式demo

    生产者生成请求,放入请求队列。 消费者从队列中取出请求进行处理。 演示了线程、队列、异常处理的使用。

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

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

    生产者 消费者 模式 c++

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

    生产者消费者模式源码--------------

    生产者消费者模式java示例源码

    C#生产者消费者模拟

    在计算机科学领域,操作系统是管理计算机硬件和软件资源的核心程序,而生产者...在实际开发中,类似的问题可能出现在数据库连接池、队列服务等场景,理解和掌握生产者消费者模式对于提升系统效率和稳定性具有重要意义。

    Java 生产消费者模式

    Java生产消费者模式是一种经典的并发设计模式,用于解决多个线程之间的协作问题。在这个模式中,生产者负责生成数据,而消费者则负责消费这些数据。它基于“缓冲区”概念,即一个有限大小的数据存储区域,生产者将...

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

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

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

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

    Java 生产者消费者模式

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

    生产消费者模式的C++实现

    利用C++实现的生产消费者模式,每个生产者和消费者都在不同的线程中异步执行。

    Java JDK1.5 生产消费者模式解决方案

    在Java编程语言中,生产者消费者模式是一种经典的多线程设计模式,用于处理并发问题。在JDK 1.5及以后的版本中,Java引入了`java.util.concurrent`包,其中包含了一些强大的并发工具类,如`Lock`接口和`Condition`...

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

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

    c++日志封装类,生产消费模式,支持二进制写日志操作

    1. 直接用于项目。 2. VC6.0/VS2008/C++11以上都可编译。 3. 支持多线程同时写操作,封装了互斥锁类、写分离线程、支持跨天日志自动生成、支持文件按大小自动分割、支持二进制直接写文本文件;...

    labview_基于生产消费者模式的多串口采集程序

    基于生产消费者模式的多串口采集程序,用labview进行上位机处理(Serial port acquisition program, based on the pattern of production of consumer PC processing using labview)

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

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

    生产者与消费者模式

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

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

    架构设计—生产者消费者模式 生产者消费者模式是一种常见的架构设计模式,它广泛应用于实际的软件开发过程中。该模式由生产者、消费者和缓冲区三部分组成。生产者负责产生数据,而消费者负责处理数据,缓冲区则作为...

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

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

Global site tag (gtag.js) - Google Analytics