`

生产者消费者模式之我的理解

 
阅读更多

我发现不管从什么话题,都能扯到Thread上面,例如:

同步-》安全-》多线程,

Core Java-》IO-》多线程,

框架-》底层-》多线程,

这样的话题导致最后的结束点,往往集中在多线程,虽然实际开发中线程级的编程,普通程序员几乎碰不到,但是还是需要我们有所了解。

找了一个生产者/消费者模式的例子,线程的很多功能的问题,都可以由它来阐述。这个例子可以用List,Stack等多种方式来模拟,这里采用最简单一个共享int,只为理解生产和消费的原理。

 

Store仓库类,为生产者和消费者所共享。对增减上锁,同步执行:

public class Store {
	private final int MAX_SIZE;
	private int count;
	public Store(int n) {
		this.MAX_SIZE = n;
		count = 0;
	}
	public synchronized void add() {
		while (count >= MAX_SIZE) {
			System.out.println("已经满了。");
			try {
				this.wait();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		count++;
		System.out.println(Thread.currentThread().toString() + " put " + count);
		this.notifyAll();
	}
	public synchronized void remove() {
		while (count <= 0) {
			System.out.println("空了 ");
		}
		try {
			this.wait();
		} catch (Exception e) {
			e.printStackTrace();
		}
		count--;
		System.out.println(Thread.currentThread().toString() + " get " + count);
		this.notify();
	}
	public static void main(String arg[]) {
		Store store = new Store(5);
		Thread pro = new Producer(store);
		Thread con = new Consumer(store);
		pro.setName("product");
		con.setName("consumer");
		Thread pro1 = new Producer(store);
		Thread con1 = new Consumer(store);
		pro1.setName("product1");
		con1.setName("consumer1");

		pro.start();
		con.start();
		pro1.start();
		con1.start();
	}
}

 

Producer生产者类。不停的add产品。每次生产后,等待1000ms,直至仓库装满。

public class Producer extends Thread {
	private Store store;
	public Producer(Store store) {
		this.store = store;
	}
	public void run() {
		while (true) {
			store.add();
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

Consumer消费者类。不停的remove产品,每次减少产品后,等待1000ms,直至仓库为空。

public class Consumer extends Thread {
	private Store store;
	public Consumer(Store store) {
		this.store = store;
	}
	public void run() {
		while (true) {
			store.remove();
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

 贴上运行的结果:

Thread[product,5,main] put 1
Thread[product1,5,main] put 2
Thread[consumer,5,main] get 1
Thread[product1,5,main] put 2
Thread[consumer1,5,main] get 1
Thread[product,5,main] put 2
Thread[consumer,5,main] get 1
Thread[product1,5,main] put 2
Thread[product,5,main] put 3
Thread[consumer,5,main] get 2
Thread[consumer1,5,main] get 1
Thread[product1,5,main] put 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product1,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product,5,main] put 3
Thread[product,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product1,5,main] put 3
Thread[product,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product1,5,main] put 3
Thread[product,5,main] put 4
Thread[consumer1,5,main] get 3
Thread[consumer,5,main] get 2
Thread[product1,5,main] put 3
Thread[product1,5,main] put 4
Thread[product,5,main] put 5
Thread[consumer1,5,main] get 4
Thread[consumer,5,main] get 3
Thread[product1,5,main] put 4
Thread[product,5,main] put 5
Thread[consumer,5,main] get 4
Thread[consumer1,5,main] get 3
Thread[product,5,main] put 4
Thread[product1,5,main] put 5
Thread[consumer1,5,main] get 4
Thread[consumer,5,main] get 3
Thread[product,5,main] put 4
Thread[product1,5,main] put 5
Thread[consumer1,5,main] get 4
Thread[consumer,5,main] get 3
Thread[product1,5,main] put 4
Thread[product,5,main] put 5
已经满了。
已经满了。

 

 

分享到:
评论

相关推荐

    生产者 消费者 模式 c++

    生产者消费者模式是一种多...通过理解并熟练掌握生产者消费者模式,开发者可以更好地设计和实现高并发、高效率的系统。在给定的"ProducerConsumerSrc"文件中,应该包含了具体的C++代码示例,可以作为学习和参考的依据。

    Java 生产者消费者模式

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

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

    首先,理解生产者消费者模式的基本原理。在这个模式中,生产者负责生成数据,而消费者则负责处理这些数据。为了确保生产与消费的有序进行,通常需要一种机制来同步这两个过程,避免生产过快导致数据堆积,或者消费者...

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

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

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

    在软件工程的诸多设计模式中,生产者消费者模式无疑占据着重要的位置。它是一种通过解耦合生产与消费过程,增强系统并发处理能力和解决不同处理速率问题的架构模式。生产者消费者模式的构建可以实现系统的高内聚和低...

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

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

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

    理解并熟练掌握生产者消费者模式对于提高系统并发性能和正确性至关重要。 通过分析和实践《深入理解计算机系统》中的例子,你可以更深入地理解多进程同步原理,以及如何在实际项目中应用这些概念。这个C语言实现的...

    生产者与消费者模式

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

    labview 生产者消费者例子

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

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

    这提供了一种直观的方式来观察和理解生产者消费者模式的工作原理。 1. **生产者消费者模型**: - **核心概念**:生产者和消费者是两个独立的线程,它们共享一个有限的缓冲区。生产者生成数据并放入缓冲区,而消费...

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

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

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

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

    多线程生产者消费者模式

    在IT行业中,多线程是并发编程的一种重要技术,它允许多个任务同时执行,从而提高了计算机系统的效率。在Delphi编程环境中,多...理解并熟练掌握生产者消费者模式对于提升Delphi应用程序的性能和可扩展性具有重要意义。

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

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

    c#多线程之生产者消费者

    综上所述,C#中的生产者消费者模式涉及线程同步、数据结构、异常处理等多个知识点,理解和熟练运用这些概念对于编写高效、可靠的并发程序至关重要。通过实践和优化,我们可以创建出能充分利用多核处理器能力、运行...

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    kafka模拟生产者消费者(集群模式)实例

    在本文中,我们将深入探讨如何在集群模式下模拟Kafka的生产者和消费者。Kafka是一种分布式流处理平台,常用于大数据实时处理和消息传递。它由Apache开发,以其高吞吐量、低延迟和可扩展性而闻名。 首先,我们要理解...

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

    在IT领域,多线程是并发编程中的一...通过理解和熟练掌握生产者消费者模式,开发者能够更好地解决并发环境下的数据处理问题,提高系统的并行性和效率。同时,结合线程池的使用,可以进一步优化资源管理,提升系统性能。

    生产者消费者_labview生产者消费者_

    标题"生产者消费者_labview生产者消费者_"暗示我们将讨论如何在LabVIEW中应用生产者-消费者模式。LabVIEW中的生产者-消费者通常涉及使用队列作为共享缓冲区,生产者将数据放入队列,而消费者则从队列中取出数据进行...

Global site tag (gtag.js) - Google Analytics