`
zl378837964
  • 浏览: 190028 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

生产者消费者问题 Thread

    博客分类:
  • java
阅读更多
    前段时间又回头看了看java基础的线程问题,感觉就是不一样;
容易得多,当初第一次真的搞晕人;
     顺便试了一下,多生产者消费者的同步通信问题:
              由生产者,消费者,仓库 三部分组成Product的处理
贴出来,交流一下。


package package com.pdsu.zhang.thread;

import java.util.LinkedList;
import java.util.Queue;
	
class Product {						 //	产品
	private int ID;
	private String name;
	
	public Product(int id, String name) {
		ID = id;
		this.name = name;
	}
	@Override
	public String toString() {
		return  "["+ID+"--"+name+"]";	
	}	
}
class Store {							//	仓库
	private final int MAX=10;
	private int flag=-1;
	Queue<Product> list =new LinkedList<Product>();// 队列
	private int id=0;
	Product temp;
	synchronized void add(){
		if(judge()==1){
			System.out.println("生产者 "+Thread.currentThread().getName()+" :仓库已满,请稍后生产.....");
			try {
				this.wait();
				//Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else{
			temp=new Product(++id,"产品");
			if(judge()==-1){
				list.offer(temp);	
				this.notify();
			}else
				list.offer(temp);	
			System.out.println(Thread.currentThread().getName()+" 生产入仓库:"+temp.toString());	
			//  不放在run{}中,否则会:先打印消费后生产!  因为print和add没有被同步;
			try {	//  等会儿再生产,模拟生产耗时
				Thread.sleep(200);
			} catch (InterruptedException e) {e.printStackTrace();}
		}
	}
	synchronized void get(){
		if(judge()==-1){
			System.out.println("消费者 "+Thread.currentThread().getName()+" :仓库无货,请稍后再来.....");
			try {
				this.wait();
				//Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else{
			if(judge()==1){
				temp = list.poll();
				this.notify();		// 不通知就会死等,死锁了
			}else
				temp = list.poll();	
			System.out.println(Thread.currentThread().getName()+" 消费了产品:"+temp.toString());	//    不放在run{}中,同上:
			try {	//  等会儿再消费,模拟消费耗时
				Thread.sleep(200);
			} catch (InterruptedException e) {e.printStackTrace();}
		}	
	}
		// 判断仓库的库存量
	synchronized int judge(){
		if(list.size()>=MAX)
			 flag=1;
		else if(list.isEmpty())
			 flag=-1;
		else flag=0;
		return flag;
	}
}

class Producer implements Runnable {	//	生产者
	Store s;
	public Producer(Store s) {
		this.s = s;
	}
	public void run() {
		while(true){				
					s.add();		
			}
		}
		
	}
class Customer implements Runnable{		//	消费者
	Store s;
	public Customer(Store s) {
		this.s = s;
	}
	public void run() {
		while(true){
				s.get();			
		}		
	}
}

public class Producer_Customer {
	/**
	 * @param args
	 * @author zhangli
	 */
	public static void main(String[] args) {
		Store s = new Store();
		Producer p= new Producer(s);
		Customer c= new Customer(s);
		Producer p1= new Producer(s);
		Customer c1= new Customer(s);
		Producer p2= new Producer(s);
		Customer c2= new Customer(s);
		
		new Thread(p,"p0").start();
		new Thread(c,"c0").start();
		new Thread(p1,"p1").start();
		new Thread(c1,"c1").start();
		new Thread(p2,"p2").start();
		new Thread(c2,"c2").start();
	}

}


测试了一下,还不错,控制的还好吧;
测试结果如下:

p0 生产入仓库:[1--产品]
c2 消费了产品:[1--产品]
消费者 c2 :仓库无货,请稍后再来.....
消费者 c1 :仓库无货,请稍后再来.....
p2 生产入仓库:[2--产品]
p1 生产入仓库:[3--产品]
p1 生产入仓库:[4--产品]
c0 消费了产品:[2--产品]
p1 生产入仓库:[5--产品]
p1 生产入仓库:[6--产品]
p1 生产入仓库:[7--产品]
p2 生产入仓库:[8--产品]
p2 生产入仓库:[9--产品]
p2 生产入仓库:[10--产品]
p2 生产入仓库:[11--产品]
c2 消费了产品:[3--产品]
p0 生产入仓库:[12--产品]
p0 生产入仓库:[13--产品]
生产者 p0 :仓库已满,请稍后生产.....
c2 消费了产品:[4--产品]
p2 生产入仓库:[14--产品]
生产者 p1 :仓库已满,请稍后生产.....
c0 消费了产品:[5--产品]
c0 消费了产品:[6--产品]
c0 消费了产品:[7--产品]
1
3
分享到:
评论
5 楼 zl378837964 2012-09-09  
Shen.Yiyang 写道
你的两边的线程如果不工作的话,就是block(wait)吧,看不出什么制约的效果; 而且你拿数据和放数据,在一个对象上面wait/notify,实际上可能误唤醒吧;用blocking queue可能更好一点,它的实现是两个等待队列

我以前也写过。可能是我表达不准确吧,反正就是这个意思,另一篇你看看,是否有问题?交流一下也好。
4 楼 Shen.Yiyang 2012-09-06  
你的两边的线程如果不工作的话,就是block(wait)吧,看不出什么制约的效果; 而且你拿数据和放数据,在一个对象上面wait/notify,实际上可能误唤醒吧;用blocking queue可能更好一点,它的实现是两个等待队列
3 楼 Shen.Yiyang 2012-09-06  
zl378837964 写道
我没有用线程池,要的就是这效果,实现相互制约的线程控制啊!亲
目的不同不相语 ~ ~ ~

相互制约的线程控制是什么概念。。没听说过
2 楼 zl378837964 2012-09-06  
我没有用线程池,要的就是这效果,实现相互制约的线程控制啊!亲
目的不同不相语 ~ ~ ~
1 楼 Shen.Yiyang 2012-09-04  
生产消费模式在应对固定的吞吐量时,非常合适;但是在吞吐变化很大,线程时而空闲时而忙碌的场景下,我觉得转变思路,把生产消费的这种脚本模型 转化成 面向对象的task,用线程池是更合理,更具有维护性的做法。 一点想法,来自于前段时间有人问,怎么总结或者减少消费者之类的问题。

相关推荐

    生产者消费者问题C#

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...

    生产者消费者问题c++实现

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步和异步操作。在C++中,我们可以利用标准库中的互斥量(mutex)、条件变量(condition_variable)等工具来实现这个问题...

    生产者消费者问题 MFC

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过共享资源在并发环境中实现线程间的协调。在这个问题中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。MFC(Microsoft Foundation ...

    java 生产者消费者问题(源码)

    Java生产者消费者问题是多线程编程中的一个经典案例,它主要展示了如何通过共享资源来实现线程间的协作。这个问题源于现实生活中的生产流水线,其中生产者负责制造产品,而消费者负责消耗这些产品。在计算机系统中,...

    生产者消费者问题

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来实现高效的数据处理。在Java中,我们通常会利用并发库来解决这类问题,其中包括线程池和阻塞队列等机制。 生产者消费者模型主要包括...

    编程实现生产者消费者或读写者的同步问题

    在多线程环境中,生产者消费者模型和读者写者问题是经典的并发控制问题,它们都涉及到资源共享与同步。本主题将深入探讨如何使用编程来解决这两个问题。 首先,生产者消费者问题是多线程并发控制中的一个经典例子。...

    生产者 消费者 模式 c++

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

    jchc.rar_tearshmj_生产者_生产者-消费者问题 c++ _生产者和消费者_生产者消费者

    《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...

    labview 生产者消费者例子

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

    操作系统生产者与消费者问题Java简单模拟实现

    操作系统中的生产者-消费者问题是多线程编程中的经典案例,主要用来展示线程同步和通信的概念。在这个Java实现中,我们将深入理解这个问题的背景、原理以及如何通过Java的并发工具来解决。 生产者-消费者问题的基本...

    java 编写的生产者与消费者问题

    4. **多线程技术**: 使用`Thread`类或者`Runnable`接口创建生产者和消费者线程。生产者和消费者在各自的线程中运行,通过调用`BlockingQueue`的`put`和`take`方法进行交互。 5. **死锁避免**: 在实现生产者-消费者...

    生产者与消费者实验报告

    为了确保数据的正确性以及系统的高效运行,必须在生产者与消费者之间建立一种有效的同步机制,以避免数据冲突或资源竞争等问题。 ##### 2.2 应用场景 生产者与消费者模型可以应用于多种场景: - **多线程程序**:...

    生产者与消费者问题

    6. **示例代码**:一个简单的生产者消费者实现可能会包含两个线程,一个生产者线程负责将数据放入队列,一个消费者线程负责从队列中取出数据。每个线程都会在适当的时机调用`wait()`和`notify()`或`notifyAll()`来...

    C#写的生产者消费者问题

    生产者消费者问题是多线程编程中的经典模型,用于展示如何有效地在并发环境下共享资源。这个问题源于现实世界的仓库模型,其中生产者负责生产商品,而消费者则负责消费这些商品。仓库作为一个缓冲区,存储有限的商品...

    生产者消费者同步问题

    生产者消费者问题是多线程编程中的一个经典案例,主要探讨如何在并发环境下高效且安全地共享有限资源。在这个问题中,我们通常有两类线程:生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了解决线程间...

    生产者与消费者 java实现

    生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...

    生产者消费者问题 Java实现

    生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。Java语言提供了丰富的工具来解决...

    java生产者与消费者问题

    在解压缩后的"proandcom"文件中,可能包含了进一步的代码示例或详细的解释,你可以查看这些文件以加深对生产者消费者问题的理解。同时,为了优化性能和避免死锁,编写多线程程序时,需要遵循良好的设计原则,例如...

Global site tag (gtag.js) - Google Analytics