package com.hupun.crm.test.thread.pattern;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 阻塞队列BlockingQueue
*
* 下面是用BlockingQueue来实现Producer和Consumer的例子
*/
public class BlockingQueueTest2 {
/**
* 定义装苹果的篮子
*/
public static class Basket {
// 篮子,能够容纳3个苹果
// BlockingQueue<String> basket = new ArrayBlockingQueue<String>(3);
BlockingQueue<String> basket = new LinkedBlockingQueue<String>(3);
// 生产苹果,放入篮子
public void produce() throws InterruptedException {
// put方法放入一个苹果,若basket满了,等到basket有位置
basket.put("An apple");
}
// 消费苹果,从篮子中取走
public String consume() throws InterruptedException {
// get方法取出一个苹果,若basket为空,等到basket有苹果为止
return basket.take();
}
}
// 测试方法
public static void testBasket() {
// 建立一个装苹果的篮子
final Basket basket = new Basket();
// 定义苹果生产者
class Producer implements Runnable {
public String instance = "";
public Producer(String a) {
instance = a;
}
public void run() {
try {
while (true) {
// 生产苹果
System.out.println("生产者准备生产苹果:" + instance);
basket.produce();
System.out.println("! 生产者生产苹果完毕:" + instance);
// 休眠300ms
Thread.sleep(300);
}
} catch (InterruptedException ex) {
}
}
}
// 定义苹果消费者
class Consumer implements Runnable {
public String instance = "";
public Consumer(String a) {
instance = a;
}
public void run() {
try {
while (true) {
// 消费苹果
System.out.println("消费者准备消费苹果:" + instance);
basket.consume();
System.out.println("! 消费者消费苹果完毕:" + instance);
// 休眠1000ms
Thread.sleep(1000);
}
} catch (InterruptedException ex) {
}
}
}
ExecutorService service = Executors.newCachedThreadPool();
Producer producer = new Producer("P1");
Producer producer2 = new Producer("P2");
Producer producer3 = new Producer("P3");
Consumer consumer = new Consumer("C1");
service.submit(producer);
service.submit(producer2);
service.submit(producer3);
service.submit(consumer);
// 程序运行3s后,所有任务停止
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
service.shutdownNow();
}
public static void main(String[] args) {
BlockingQueueTest2.testBasket();
}
}
转自:http://www.oschina.net/code/snippet_113883_12675
----------------------------------------
简单的队列缓存区实现:
public class Queue <E>{
private List<E> queue = new ArrayList<E>();
private int max;
public Queue() {
super();
max=100;
}
public Queue(int max) {
super();
this.max = max;
}
public synchronized void produce(E e) {
while(true){
if(queue.size()>=max){
try {
wait();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}else{
break;
}
}
queue.add(e);
notifyAll();
}
public synchronized E consume() {
E result = null;
while(true){
if(queue.size()<=0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
result = queue.remove(0);
notifyAll();
break;
}
}
return result;
}
}
====================================
环形缓冲区实现:
public class CircularBuf {
int NMAX = 1000;
int iput = 0; // 环形缓冲区的当前放人位置
int iget = 0; // 缓冲区的当前取出位置
int n = 0; // 环形缓冲区中的元素总数量
Object buffer[];
public CircularBuf() {
super();
buffer = new Object[NMAX];
}
public CircularBuf(int nmax) {
super();
NMAX = nmax;
buffer = new Object[NMAX];
}
/*
* 环形缓冲区的地址编号计算函数,,如果到达唤醒缓冲区的尾部,将绕回到头部。
*
* 环形缓冲区的有效地址编号为:0到(NMAX-1)
*
*/
public int addring(int i) {
return (i + 1) == NMAX ? 0 : i + 1;
}
/* 从环形缓冲区中取一个元素 */
public synchronized Object get() {
int pos;
while (true) {
if (n > 0) {
pos = iget;
iget = addring(iget);
n--;
// System.out.println("get-->" + buffer[pos]);
notifyAll();
return buffer[pos];
} else {
// System.out.println("Buffer is Empty");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/* 向环形缓冲区中放人一个元素 */
public synchronized void put(Object z) {
while (true) {
if (n < NMAX) {
buffer[iput] = z;
// System.out.println("put<--" + buffer[iput]);
iput = addring(iput);
n++;
notifyAll();
} else {
// System.out.println("Buffer is full");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
转自:http://shilei78.blog.163.com/blog/static/76004198201052863720488/
相关推荐
通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。
生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
总之,Java中的生产者-消费者模式是多线程编程中解决数据共享和同步问题的有效手段,通过合理利用`BlockingQueue`等并发工具类,我们可以构建高效、稳定的多线程应用。在开发过程中,了解和掌握这种模式有助于提高...
Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...
通过以上步骤,我们可以在Delphi中实现一个多线程生产者消费者模式的应用。这种模式在处理大量数据输入和输出,以及需要高效利用系统资源的场景下尤其有用,如数据库导入导出、实时数据处理和网络通信等。理解并熟练...
综上所述,C#中的生产者消费者模式涉及线程同步、数据结构、异常处理等多个知识点,理解和熟练运用这些概念对于编写高效、可靠的并发程序至关重要。通过实践和优化,我们可以创建出能充分利用多核处理器能力、运行...
Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...
在Java中,可以使用`BlockingQueue`接口来实现生产者-消费者模式,它已经内置了线程安全的队列操作。生产者可以使用`offer()`方法添加元素,消费者则用`take()`方法取出元素,这两个方法会自动处理等待和唤醒操作。 ...
8. **死锁和饥饿**:在实现多线程生产者消费者模型时,必须警惕可能出现的死锁和饥饿问题。死锁是两个或更多线程相互等待对方释放资源导致的僵局,而饥饿则是指某一线程因为资源分配不公平而无法获得执行的机会。...
2. **资源共享**:在生产者消费者模式中,数据的生产和消费都需要访问一个公共的数据结构,比如一个队列。这个队列就是共享资源,需要被合理地管理和控制。Java提供了多种数据结构,如ArrayBlockingQueue,...
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...
本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`<thread>`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...
涉及 线程创建与退出、线程暂停、父子线程之前以及兄弟线程之间的参数和信号传递、多线程的以及多线程的管理。要求是练习的demo对于以上的点只要涉及基础即可。 主线程、生产者线程(一)、消费者管理线程(一)、...
在IT领域,多线程是并发编程中的一...通过理解和熟练掌握生产者消费者模式,开发者能够更好地解决并发环境下的数据处理问题,提高系统的并行性和效率。同时,结合线程池的使用,可以进一步优化资源管理,提升系统性能。
综上所述,这个"操作系统课程设计多线程 生产者消费者问题"项目将涵盖Java多线程编程、并发控制、线程安全的数据结构和通信机制等多个重要知识点,对理解并发编程有极大的实践价值。在实际操作中,需要综合运用这些...
生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...
生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...
"生产者-消费者问题"是多线程编程中一个经典的同步问题,它涉及到资源的共享和线程间的协作。这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既...