`

线程间通信(生产者-消费者模式)

阅读更多
引用
有如下情形线程A向盘子里放桔子(盘子很小只能容得下个桔子)放完桔子后如果其它线程没有来拿桔子则A下次
再放桔子时留在盘子里上次那个桔子就被覆盖掉了(现实并非这样)但我们并不希望这个可口桔子就这样被第 2个
桔子覆盖掉我们理想情况是:线程A每次在盘子里放完个桔子后马上通知其它线程来取这个桔子这时线程A就暂停
放桔子在盘子里其它线程取走桔子的后马上通知A桔子已经被取走这时A继续放下个桔子并通知其它线程来取这
样反复下去(为了不让产生者永久放消费者永久地取可限定生产者共要放100次桔子)……于是放个就取走个所有
桔子都被成功取走
在上述案例子中线程A和线程B的间是生产者和消费者关系线程A生产桔子把桔子在盘子里线程B从盘子里拿走桔
子享受美味而且为了达到生产个拿走个这样对过程线程A必须告诉线程B:桔子已经放好了来拿吧你拿走了我再放
下个当线程B拿走后必须告诉线程A:我把桔子拿走了你快放下个吧线程A和B互相告诉对方动作就是线程间通信
取放桔子整个过程涉及到了 4个对象分别是生产者(线程A)消费者(线程B)消费商品(桔子)商店(盘子)因此可以把
上述过程看作是生产者和消费者在商店里交易桔子下图描绘了上述整个过程:


Code:
public class ProConTest {
	public static void main(String[] args) {
		Panel pan = new Panel();
		Consumer c = new Consumer(pan);
		Producer p = new Producer(pan, c);
		c.setDaemon(true);/*将消费者设为守护线程也就是说当生产者不再生产时消费者立即主动不再消费*/
		p.start();
		c.start();
	}
}



public class Consumer extends Thread{
	Panel pan;

	public Consumer(Panel pan) {
		this.pan = pan;
	}

	public void run(){
		synchronized(this){
			while(true){
			if(pan.isBlank){
			try{
				wait();
			}
			catch(Exception ex){
				ex.printStackTrace();}
			}
			pan.getOrange();
			notify();
			}
		}
	}
}


public class Producer extends Thread {
	Panel pan = null;
	Consumer c = null;

	public Producer(Panel pan, Consumer c) {
		this.pan = pan;
		this.c = c;
	}

	public void run() {
		synchronized (c) {
			int count = 0;
			// 生产者共要生产100个桔子
			while (count < 100) {
				if (!pan.isBlank) {
					try {
						c.wait();
					} catch (Exception ex) {
						ex.printStackTrace();
					}
					count++;
				}
				double orgWeight = Math.random() * 100;
				Orange org = new Orange(orgWeight, "red");
				pan.putOrange(org);
				c.notify();
			}
		}
	}
}


public class Panel {
	public boolean isBlank = true;
	private Orange org;

	public void putOrange(Orange org) {
		this.org = org;
		isBlank = false;
		System.out.println("I put: " + org.toString());
	}

	public Orange getOrange(){
		System.out.println("I get: " + org.toString());
		isBlank = true;
		return org;
	}
}


public class Orange {
	double weight;
	String color;
	public Orange(double weight, String color){
	this.weight = weight;
	this.color = color;
	}
	public String toString() {
		return "Orange, weight = " + weight + ", color = " + color;
	}
}

分享到:
评论

相关推荐

    多线程间通信:多生产者-多消费者实例

    在IT领域,多线程间通信是并发编程中的重要概念,尤其在服务器端应用和高并发系统中。本文将深入探讨“多生产者-多消费者”模式,这是一种经典的线程同步问题,旨在优化资源的利用和提高系统的效率。在这个模式中,...

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

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

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`&lt;thread&gt;`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    生产者-消费者.zip

    生产者-消费者模式的核心思想是共享资源(通常是一个缓冲区)的分离,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。这种模式利用了线程间的协作,实现了数据的生产和消费的解耦,并避免了...

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

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

    linux多进程生产消费

    在Linux操作系统中,多进程生产者-消费者模型是一种常见的并发编程模式,用于处理多个进程间的协同工作,特别是在数据处理和I/O操作中。这个模型基于一个核心概念:生产者进程生成数据,而消费者进程消耗这些数据。...

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

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

    JAVA_生产者-消费者

    4. **适用场景**:生产者-消费者模式广泛应用于多线程系统,如数据库连接池、消息队列、任务调度等。在这些场景中,生产者通常代表数据的生成或任务的提交,而消费者则负责处理这些数据或执行任务。 总结来说,...

    JAVA课程设计(生产者-消费者问题)

    线程间的同步和通信是解决生产者-消费者问题的核心,例如使用`start()`启动线程,`sleep()`让线程暂停一段时间。 系统功能包括: - 增加线程:生产者线程生成产品。 - 消费线程:消费者线程消耗产品。 - 显示剩余...

    使用Qt信号量实现单生产者多消费者模型

    在多线程编程中,设计模式是解决特定问题的有效手段,其中之一便是生产者-消费者模型。这个模型描述了两个或多个线程之间的协作,其中一方(生产者)生成数据,另一方(消费者)消费这些数据。在Qt框架下,我们可以...

    【IT十八掌徐培成】Java基础第08天-05.多线程-生产者-消费者2.zip

    通过理解并熟练运用生产者-消费者模式,开发者可以构建高效、可靠的多线程应用,处理并发问题,并优化系统资源的利用率。在Java中,这一模式的应用不仅限于简单的队列操作,还可以扩展到更复杂的并发场景,如分布式...

    labview 生产者消费者例子

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

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

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

    解决线程死锁问题的 生产者 消费者程序.rar_linux_linux 线程_生产者_生产者 消费者_生产者消费者

    为了解决生产者-消费者问题,开发者可能会使用互斥锁(mutexes)来保护对缓冲区的访问,使用条件变量(condition variables)来实现线程间的同步。互斥锁确保任何时候只有一个线程能访问缓冲区,而条件变量允许线程...

    生产者 消费者 模式 c++

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

    46.线程间的通信-生产者与消费者模式-多生产者与多消费者(操作值).mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    48.线程间的通信-生产者与消费者模式-一生产者多消费者(操作集合).mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

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

    生产者消费者模式基于操作系统提供的信号量(Semaphore)或管程(Monitor)等机制,以解决进程间的通信和同步问题。在这个模式中,生产者进程负责生成数据并放入缓冲区,而消费者进程则负责从缓冲区取出数据进行处理...

    多线程生产者消费者模式

    生产者消费者模式的核心思想是通过共享缓冲区来实现线程间的通信。生产者线程负责生成数据并放入缓冲区,而消费者线程则从缓冲区取出数据进行处理。为了保证数据的一致性和避免资源竞争,通常会引入信号量...

    android 生产者消费者模式

    在Android开发中,生产者-消费者模式是一种常见的多线程设计模式,用于处理并发问题,尤其是在数据处理和异步操作中。这个模式的核心思想是通过一个共享的数据缓冲区,使得生产者线程可以生成数据并放入缓冲区,而...

Global site tag (gtag.js) - Google Analytics