现在的位置: 首页 > 综合 > 正文

多线程-生产者消费者

2013年10月28日 ⁄ 综合 ⁄ 共 3874字 ⁄ 字号 评论关闭

生产者生产面包,消费者消费面包,当生产者生产到MAX个时,等待消费者消费,消费者没面包消费时,等待生产者生产,只有有面包,消费者就希望消费,但消费者食量有限,等到消费者消费到25个面包时,就不消费了,生产者生产到MAX个面包后,也停止了劳动!

package jk2;

import java.util.LinkedList;
import java.util.Queue;

public class SynThreadTest {

	/**
	 * @param args
	 * @author jake20001@126.com
	 */
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int MAX=10;
		Queue<Object> q = new LinkedList<Object>();
		Producer p = new Producer(q,MAX);
		Consumer c = new Consumer(q,p);
		p.start();
		c.start();
	}
}

class Producer extends Thread {
	Queue<Object> q ;
	int total;
	int i = 0;
	
	Producer(Queue<Object> q,int total){
		this.q = q;
		this.total = total;
	}
	
	public void run(){
		while(true){
			synchronized(q){
				
					while(q.size()==total){
						System.out.println("Producer is full!");
						try {
							q.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					i++;
					Object b = new Bread(i);
					if(q.add(b)){
						System.out.println("Producer is processing! " + b.toString());
						q.notify();
						try {
							Thread.sleep(10);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
			}
		}
	}
}

class Consumer extends Thread {
	Queue<Object> q;
	Producer pr;
	
	Consumer(Queue<Object> q,Producer pr){
		this.q = q;
		this.pr = pr;
	}
	
	public void run(){
		
		while(true){
			synchronized(q){
				
					while(q.size()==0){
						System.out.println("Consumer is waiting for products! ");
						try {
							q.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				
					if(q.size()>0){
						/*System.out.println("================" + pr.i);
						if(pr.i >= 25){ 
							System.out.println("You eat too much!Stop!");
							return;
						}*/
						Object rb= q.remove();
						System.out.println("Consumer is consuming products! "  + rb.toString());
						if(((Bread) rb).getNumber()==25){
							System.out.println("精确控制到消费者的消费量,然后生产者生产到规定的最大量就等待!");
							System.out.println("You eat too much!Stop!");
							return;
						}
						q.notify();
						try {
							Thread.sleep(10);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
			}
		}
	}
	
}

class Bread{
	int number;

	public Bread(int n) {
		number = n;
	}
	public int getNumber() {
		return number;
	}

	public void setNumber(int number) {
		this.number = number;
	}
	
	public String toString(){
		
		return "第  " +  number + " 个 面包!";
	}
}

输出:

Producer is processing! 第  1 个 面包!
Consumer is consuming products! 第  1 个 面包!
Consumer is waiting for products! 
Producer is processing! 第  2 个 面包!
Producer is processing! 第  3 个 面包!
Producer is processing! 第  4 个 面包!
Producer is processing! 第  5 个 面包!
Producer is processing! 第  6 个 面包!
Producer is processing! 第  7 个 面包!
Producer is processing! 第  8 个 面包!
Consumer is consuming products! 第  2 个 面包!
Consumer is consuming products! 第  3 个 面包!
Consumer is consuming products! 第  4 个 面包!
Consumer is consuming products! 第  5 个 面包!
Producer is processing! 第  9 个 面包!
Producer is processing! 第  10 个 面包!
Producer is processing! 第  11 个 面包!
Producer is processing! 第  12 个 面包!
Producer is processing! 第  13 个 面包!
Producer is processing! 第  14 个 面包!
Producer is processing! 第  15 个 面包!
Producer is full!
Consumer is consuming products! 第  6 个 面包!
Consumer is consuming products! 第  7 个 面包!
Consumer is consuming products! 第  8 个 面包!
Producer is processing! 第  16 个 面包!
Producer is processing! 第  17 个 面包!
Consumer is consuming products! 第  9 个 面包!
Consumer is consuming products! 第  10 个 面包!
Consumer is consuming products! 第  11 个 面包!
Consumer is consuming products! 第  12 个 面包!
Consumer is consuming products! 第  13 个 面包!
Consumer is consuming products! 第  14 个 面包!
Consumer is consuming products! 第  15 个 面包!
Consumer is consuming products! 第  16 个 面包!
Producer is processing! 第  18 个 面包!
Producer is processing! 第  19 个 面包!
Consumer is consuming products! 第  17 个 面包!
Producer is processing! 第  20 个 面包!
Consumer is consuming products! 第  18 个 面包!
Consumer is consuming products! 第  19 个 面包!
Consumer is consuming products! 第  20 个 面包!
Consumer is waiting for products! 
Producer is processing! 第  21 个 面包!
Producer is processing! 第  22 个 面包!
Producer is processing! 第  23 个 面包!
Producer is processing! 第  24 个 面包!
Producer is processing! 第  25 个 面包!
Producer is processing! 第  26 个 面包!
Producer is processing! 第  27 个 面包!
Producer is processing! 第  28 个 面包!
Producer is processing! 第  29 个 面包!
Producer is processing! 第  30 个 面包!
Producer is full!
Consumer is consuming products! 第  21 个 面包!
Consumer is consuming products! 第  22 个 面包!
Consumer is consuming products! 第  23 个 面包!
Consumer is consuming products! 第  24 个 面包!
Consumer is consuming products! 第  25 个 面包!
精确控制到消费者的消费量,然后生产者生产到规定的最大量就等待!
You eat too much!Stop!
Producer is processing! 第  31 个 面包!
Producer is processing! 第  32 个 面包!
Producer is processing! 第  33 个 面包!
Producer is processing! 第  34 个 面包!
Producer is processing! 第  35 个 面包!
Producer is full!

抱歉!评论已关闭.