`
Cb123456
  • 浏览: 65994 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

生产、消费模型

    博客分类:
  • java
阅读更多

生产、消费模型:

一、生产、消费模型:

  在线程间通讯的时候,当在一个对象上调用wait()方法时,当前线程就会进入wait状态,直到收到另一个对象的notify()发出通知,才会执行下一部计算,而且线程在wait的时候,也可能被中断,这就是"生产/消费模型"

 

二、简单实现:

 1.生产和消费线程用来操作的对象:

 

package 生产_消费模型;
/**
 * 用来交换的数据对象模型
 * @author Administrator
 *
 */
public class Student {

	int id;
	String name;
	
	public String toString(){
			
		return id+"<>"+name;
	}
	
}

 

 

 2.生产线程:

 

package 生产_消费模型;

import java.util.List;

public class ProduceThread extends Thread {

	//与消费线程或以共同存取的对象列表
	private List shareList;
	
	//用来标记的放入对象的每一个独立的编号
	private static int count;
	
	//构造器参数是生产线程要放入数据的队列
	public ProduceThread(List shareList){
	    this.shareList = shareList;	
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		System.out.println("生产线程已经启动:"+shareList.size());
		while(true){
			try {
				Thread.sleep(2000);
				
				synchronized (shareList) {
					
					while(shareList.size()>0){
						shareList.wait();
					}
					
					while(shareList.size()==0){
						
						Student st = new Student();
						count++;
						st.id = count;
						st.name="对象"+count;
						
					System.out.println("生产线程放入对象:"+st.toString());	
						
						shareList.add(st);
						shareList.notify();
					}
					
				}
				
				
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			

		}
	}
}

 

 

    通过构造函数把操作对象的List传进去,如果List里面有对象,就要wait,而当List里面没有对象,该生产线程就要产生一个,并发出notify的通知.并把操作的对象加入操作对象的List

 

 3.消费线程:

package 生产_消费模型;

import java.util.List;

/**
 * 消费线程
 * @author Administrator
 *
 */

public class CustomerThread extends Thread{

	private List shareList;
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//super.run();
		System.out.println("消费线程已经启动:"+shareList.size());
		
		while(true){
			
			synchronized (shareList) {
				
				while (shareList.size()==0) {
				//如果没有,消费线程就要等待
					try {
						shareList.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
				
				while(shareList.size()>0){
					
					System.out.println("消费线程取出:"+shareList.remove(0).toString());
					
					//取出一个后,就发通知
					shareList.notify();
					
				}
				
			}
			
			
		}
	}
	
	public CustomerThread(List shareList){
		
		this.shareList = shareList;
	}
	
}

 

    通过构造函数把操作对象的List传进去,当List里面没有对象时,消费线程也就没什么可以消费的了,就要进入wait状态,当List里面有对象时,消费线程就消费一个,并发出notify的通知。

 

 4.Main:

package 生产_消费模型;

import java.util.LinkedList;
import java.util.List;

/**
 * 主函数
 * @author Administrator
 *
 */
public class Cb123456 {

	public static void main(String[] args) {
		//生产,消费线程交换的队列
		List shareList = new LinkedList();
		
		//启动生产线程
		new ProduceThread(shareList).start();
		
		//启动消费线程
		new CustomerThread(shareList).start();
	}
	
}

 

 

三、运行结果:

 

 

四、结果分析:

 1.Main里面,通过new关键字给LinkedList分配内存空间,同时实例化,但此时的LinkedList里面什么都没有,所以是生产线程先执行的

 2.在控制台可以看见在输出结果的时候,生产线程和消费线程总是同时显示结果的.

 

五、补充:

1.LinkedList:

 


 

2.null和" "

  其中null是表示没有地址.而" "表示是一个字符串,有地址的,但是字符串里面的内容却是空的,null就像没有锅,而" "表示有锅却没有米的

 

六、总结:

  生产消费模型:当集合中没有对象时,生产线程会产生一个,并发出通知,然后消费线程就把它给消费了。

  • 大小: 13 KB
  • 大小: 18.9 KB
1
0
分享到:
评论
2 楼 Cb123456 2015-06-02  
bewithme 写道
你太逗了用中文包名

呵,逗也是种属性,
1 楼 bewithme 2015-06-02  
你太逗了用中文包名

相关推荐

    pp.rar_生产消费模型

    在这个场景中,“pp.rar_生产消费模型”显然指的是一个用于演示这一概念的代码实现,具体是通过烤羊肉串模型来展示的。烤羊肉串模型是一个形象化的比喻,它将羊肉串看作是产品,厨师(生产者)负责制作羊肉串,食客...

    监听器模式(生产消费模型)

    生产消费模型是另一种编程概念,常用于多线程环境。在这个模型中,生产者负责创建数据,消费者负责消耗数据。生产者和消费者之间需要协调工作,避免生产过快导致数据堆积,或者消费过快导致无数据可消费。这通常通过...

    C++实现生产与消费者模型

    在计算机科学中,生产者-消费者模型是一种经典的并发编程问题,用于解决多个线程之间如何高效、安全地共享资源的问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。C++作为一门支持...

    pthread 多线程 生产消费模型例程

    用pthread 实现 生产消费模型 /* * File : pc.c * * Title : Demo Producer/Consumer. * * Short : A solution to the producer consumer problem using * pthreads. * * Long : * * Author : Andrae ...

    QT/C++11多线程、互斥/读写锁、多生产消费模型

    QT/C++11多线程、互斥/读写锁、多生产消费模型

    多线程_生产消费模型

    本话题将深入探讨"生产者-消费者模型"(Producer-Consumer Model)在Windows多线程环境中的应用,以及如何利用关键代码段(Critical Section)和互斥量(Mutex)来实现线程同步。 生产者-消费者模型是一种经典的...

    LinuxC语言实现生产者和消费者模型

    LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...

    Qt入门练习项目——生产者消费者模型.zip

    **Qt入门练习项目——生产者消费者模型** 在编程领域,生产者消费者模型是一种常见的多线程同步问题的解决方案。这个模型通常用于处理数据流的异步处理,其中一个或多个线程(生产者)生成数据,而其他线程(消费者...

    python实现生产者消费者并发模型

    多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...

    多个消费者生产者模型

    "多个消费者生产者模型"是一种典型的多线程同步问题的解决方案,它主要用于处理并发操作中的资源分配和协调。在这个模型中,"生产者"负责生成数据或任务,而"消费者"则负责处理这些数据或任务。接下来,我们将深入...

    消费者生产者模型 c++

    ### 消费者生产者模型 C++ #### 一、代码概览 此代码段实现了一个典型的消费者生产者模型,利用 C++ 和 Windows API 进行线程管理和同步控制。主要功能包括: - 定义了一个最大缓冲区数量 (`MAX_BUFFER_NUM`) 为 ...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    生产者消费者多进程模型Qt

    在IT领域,生产者消费者模型是一种经典的并发编程模式,它源于操作系统理论,用于解决资源的高效利用和同步问题。在本案例中,该模型被应用于一个使用Qt框架开发的多进程环境中,使得生产者进程与消费者进程能有效地...

    生产者消费者模型的演变

    生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...

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

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

    RocketMQ生产消费者模型实现

    四、RocketMQ消费模型实现 1. 广播消费(Broadcasting):每个消费者都会收到所有的消息,适用于所有消费者都需要处理相同消息的场景。 2. 点对点消费(Point-to-Point):每个消息只被一个消费者消费,适用于处理...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    生产者消费者模型源码

    生产者,消费者,线程同步,模型,锁

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

    在C#编程中,"生产者消费者模型"是一种常见的多线程设计模式,它通过分离数据的生产和消费过程,使得生产者线程可以专心于创建数据,而消费者线程则专注于处理这些数据,两者互不干扰,提高了系统效率。在这个模型中...

Global site tag (gtag.js) - Google Analytics