`
programmer_Q
  • 浏览: 5679 次
社区版块
存档分类
最新评论

生产者与消费者,学习多线程

阅读更多
package ThreadDemo;

import java.util.Date;

/*生产者(Producer)将产品交给店员(check),而消费者(Customer)从店员出取走产品。
 店员一次只能维持固有数量的产品(比如20)。如果生产者试图生产更多的产品,店员会叫生产者停一下。
 如果店中有空位,店员会叫生产者生产。如果店中没有产品了,会告诉消费者等一下。如果店中有产品了
 再通知消费者来取走。
 *
 *分析1
 *1:是否涉及到多线程的问题?是!生产者,消费者
 *2:是否会涉及到共享数据?是  
 *3:此共享数据是谁?产品的数量
 *4:是否涉及到线程的通信?存在生产者与消费者的通信。
 *分析2
 *1.有个店员类Clerk,负责检查当前产品数量,并应该有两个方法,增加产品,减少产品
 *2:有个生产者Producer.Producer 是个线程,需要循环不断的  调用增加产品的方法。
 *3:有个消费者Customer Producer 是个线程,需要循环不断的  调用减少产品的方法。
 *
 */
class Clerk { // 店员
	int product = 0;
	Date d = new Date();

	public void addProduce() {

		synchronized (Clerk.class) { // 如果这个地方用的是类锁,后面的wait,就必须用Clerk.class.wait这种形式
										// Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,
										// 也就是wait,与notify是针对已经获取了Obj锁进行操作.
			// synchronized (this) {
			if (product >= 20) {
				try {
					Clerk.class.wait();
					// wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			} else {
				product++;
				System.out.println(Thread.currentThread().getName() + ":"
						+ product);
			}
			Clerk.class.notifyAll();
			// notifyAll()

		}

	}

	public void reduceProduce() {

		synchronized (Clerk.class) {

			if (product <= 0) {
				try {
					Clerk.class.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			} else {
				System.out.println(Thread.currentThread().getName() + ":"
						+ product);
				product--;
			}
			Clerk.class.notifyAll();
		}

	}

}

class Producer implements Runnable {// 生产者
	Clerk clerk;

	public Producer(Clerk clerk) {
		this.clerk = clerk;
	}

	public void run() {
		while (true) {
			clerk.addProduce();
			// TODO Auto-generated method stub
		}
	}
}

class Customer implements Runnable {// 生产者
	Clerk clerk;

	public Customer(Clerk clerk) {
		this.clerk = clerk;
	}

	public void run() {
		while (true) {
			clerk.reduceProduce();
		}
	}
}

public class CopyOfTestProduceConsume {
	public static void main(String[] args) {
		Clerk clerk = new Clerk();
		Producer producer = new Producer(clerk);
		Thread thread1 = new Thread(producer);
		thread1.setName("生产者");
		Customer customer = new Customer(clerk);
		Thread thread2 = new Thread(customer);
		thread2.setName("消费者");

		thread1.start();
		thread2.start();

	}

}

 

分享到:
评论

相关推荐

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

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

    生产者与消费者多线程案例

    在多线程编程中,生产者与消费者问题是一个经典的问题,它涉及到线程间的同步和通信。此案例中,我们看到一个使用互斥锁(mutexes)和条件变量(conditions)来解决该问题的实现。代码由Zou Jian Guo于2003年12月22...

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    多线程实现生产者消费者

    在IT领域,多线程是一种常见的编程模型,用于提高程序的执行效率和资源利用率。它允许程序中的多个任务(线程)并发运行,共享...通过分析和修改这个代码,我们可以深入学习多线程编程的细节,提升我们的并发编程能力。

    多线程实例,关于生产者与消费者的问题

    "生产者-消费者问题"是多线程编程中一个经典的同步问题,它涉及到资源的共享和线程间的协作。这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既...

    生产者与消费者实例代码,线程学习必备

    生产者与消费者模型是多线程编程中的一个经典范例,它主要用来演示如何通过共享资源来协调两个或多个并发执行的线程。这个模型在实际应用中非常常见,例如在数据库缓存、消息队列以及内存管理等领域都有广泛应用。 ...

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

    总结来说,Linux多线程实现生产者消费者模式涵盖了多线程创建、线程同步与互斥、锁机制、条件变量以及线程屏障等核心知识点。这些知识点是Linux下进行高级多线程编程不可或缺的部分,对于理解现代操作系统中多任务...

    生产者消费者为模型的多线程编程c#原创

    通过这个项目,学习者可以深入理解C#中的多线程编程,掌握如何在实际应用中实现生产者消费者模型,以及如何利用.NET框架提供的工具有效地进行线程同步和通信。这是一个很好的实战练习,有助于提升并发编程能力。

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

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

    (Linux C)利用多进程或多线程模拟实现生产者/消费者问题

    以下是对"Linux C"环境下,利用多进程或多线程实现生产者/消费者问题的详细解释: 首先,我们需要了解基础概念: 1. **多进程**:在Linux系统中,每个进程都有自己的独立内存空间,它们之间的通信通常通过文件、...

    12.2 Qt5多线程:使用QWaitCondition实现生产者和消费者

    "12.2 Qt5多线程:使用QWaitCondition实现生产者和消费者"这个主题聚焦于如何在Qt5环境中使用QWaitCondition类来解决经典的生产者-消费者问题。 生产者-消费者问题是多线程编程中的一个经典模型,它涉及到两个或多...

    生产者消费者线程实验

    本实验使用多线程同步方法解决生产者消费者问题,主要涉及的技术点包括: - **互斥锁(Mutex Locks)**:用于实现对缓冲区的互斥访问,确保同一时间只有一个线程能够修改缓冲区状态。 - **信号量(Semaphores)**:...

    模仿线程"生产者与消费者"的例子

    在Java或其他支持多线程的语言中,实现生产者-消费者模式通常会用到线程安全的数据结构,如队列(Queue),以及同步原语,如锁(Lock)或信号量(Semaphore)。例如,Java的`BlockingQueue`接口就是一个很好的选择,...

    生产者消费者程序

    生产者消费者问题是一个经典的多线程同步问题,源自操作系统领域,用于模拟生产者与消费者之间的交互。在这个场景中,生产者负责生成数据,而消费者则负责处理这些数据。MFC(Microsoft Foundation Classes)是微软...

    四川大学操作系统课程设计高分报告-第三次实验-生产者和消费者问题.doc

    实验报告的标题揭示了本次操作系统课程设计的主题——“生产者和消费者问题”,这是一个经典的问题,常见于多线程编程和并发控制的学习中。该问题旨在模拟一个系统,其中多个生产者线程生产产品,而多个消费者线程...

    java多线程生产者消费者问题示例

    java多线程学习,生产者消费者问题示例

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

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

    操作系统中生产者与消费者问题实例

    操作系统中的生产者与消费者问题是多线程编程中的一个经典模型,它主要研究的是如何有效地在共享资源之间协调生产者和消费者的行为,以避免数据竞争和死锁等问题。在这个C#编写的实例中,我们将深入探讨这个问题及其...

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

    Java多线程中的生产者-消费者模式是一种典型的同步与协作模型,它用于解决在多线程环境下资源的有效利用和协调问题。在这个模式中,通常有两个角色:生产者和消费者。生产者负责创建产品,而消费者则负责消费这些...

    多进程同步解决生产者消费者问题(c++源码)

    ### 多进程同步解决生产者消费者问题(C++源码解析) #### 一、问题背景与定义 生产者-消费者问题是一种经典的并发编程问题,它最初由Edsger Dijkstra提出,用来展示信号量机制的应用场景。在这个问题中,存在两类...

Global site tag (gtag.js) - Google Analytics