java多线程 生产者-消费者

 

 

对于此模型,应该明确一下几点:
1、生产者仅仅在仓储未满时候生产,仓满则停止生产。
2、消费者仅仅在仓储有产品时候才能消费,仓空则等待。
3、当消费者发现仓储没产品可消费时候会通知生产者生产。
4、生产者在生产出可消费产品时候,应该通知等待的消费者去消费。 

 

要消费的实体 : Message

   

/**
 * @ClassName: Message
 * @Description: "生产者-消费者"模型中要消费的实体
 * @author 
 * @date 2011-8-17
 * @version V1.0
 */
public class Message {

	public static int messageId;
	private String content;
	
	/**
	 * @return 返回 messageId
	 */
	public static int getMessageId() {
		return messageId;
	}
	/**
	 * @param 对messageId进行赋值
	 */
	public static void setMessageId(int messageId) {
		Message.messageId = messageId;
	}
	/**
	 * @return 返回 content
	 */
	public String getContent() {
		return content;
	}
	/**
	 * @param 对content进行赋值
	 */
	public void setContent(String content) {
		this.content = content;
	}
}

 

消费者 : Consumer

   

/**
 * @ClassName: Consumer
 * @Description: 消费者
 * @author 
 * @date 2011-8-17
 * @version V1.0
 */
public class Consumer implements Runnable {

	//消息队列
	private MessageQueue queue;

	/**
	 * <p>Title: Consumer</p>
	 * <p>Description: 构造方法</p>
	 * @param queue
	 */
	public Consumer(MessageQueue queue) {
		this.queue = queue;
	}

	/**
	 * <p>Title: run</p>
	 * <p>Description: 执行线程</p>
	 * @see java.lang.Thread#run()
	 * @author 
	 */
	public void run() {

		while (true) {
			//消费
			queue.consume();
			
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}
}

 

生产者: Producer

   

/**
 * @ClassName: Producer
 * @Description: 生产者
 * @author 
 * @date 2011-8-17
 * @version V1.0
 */
public class Producer implements Runnable {

	//消息队列
	private MessageQueue queue;
	
	/**
	 * <p>Title: Producer</p>
	 * <p>Description: 构造方法</p>
	 * @param queue
	 */
	public Producer(MessageQueue queue){
		this.queue = queue;
	}
	
	/**
	 * <p>Title: run</p>
	 * <p>Description: 执行线程</p>
	 * @see java.lang.Thread#run()
	 * @author 
	 */
	@SuppressWarnings("static-access")
	public void run(){
		
		//要生产的实体
		Message message = null;
		
		while (true){
			
			message = new Message();
			
			message.setMessageId(++Message.messageId);
			message.setContent("food"+Message.messageId);
			
			//生产
			queue.produce(message);
			
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 

消息队列 : MessageQueue

   

/**
 * @ClassName: MessageQueue
 * @Description: 消息队列
 * @author 
 * @date 2011-8-17
 * @version V1.0
 */
public class MessageQueue {

	private static Logger log = Logger.getLogger(MessageQueue.class);

	// 队列
	List<Message> queue = new ArrayList<Message>(10);

	/** 队列中message对象的最大值,默认为500 */
	int maxMessageNum = 500;

	/**
	 * @Title: produce
	 * @Description: 生产
	 * @param message
	 *            要生产的实体
	 * @author 
	 */
	public synchronized void produce(Message message) {

		try {
			while (queue.size() == maxMessageNum) {

				log.info(Thread.currentThread().getName() + ",队列满,等待中...");

				this.wait();
			}
		} catch (InterruptedException e) {
			log.error("wait() exception.", e);
		}

		queue.add(message);

		log.info(Thread.currentThread().getName() + ",正在生产"
				+ message.getContent() + ",当前个数:" + getCount());

		notifyAll();
	}

	/**
	 * @Title: consume
	 * @Description: 消费
	 * @param message
	 *            要消费的实体
	 * @author 
	 */
	public synchronized void consume() {

		try {
			while (queue.size() == 0) {

				log.info(Thread.currentThread().getName() + ",队列空,等待中...");

				this.wait();
			}
		} catch (InterruptedException e) {
			log.error("wait() exception.", e);
		}
		
		Message message = queue.get(0);
		queue.remove(message);

		log.info(Thread.currentThread().getName() + "正在消费"
				+ message.getContent() + "。。。 ,当前个数: " + getCount());

		notifyAll();
	}

	/**
	 * @Title: getCount
	 * @Description: 获取队列中的当前个数
	 * @return [描述]
	 * @author 
	 */
	private int getCount() {

		synchronized (this) {
			return queue.size();
		}
	}
}

 

测试类 :Test

  

/**
 * @ClassName: Test
 * @Description: 测试
 * @author 
 * @date 2011-8-17
 * @version V1.0
 */
public class Test {

	/**@Title: main
	 * @Description: 测试
	 * @param args 
	 * @author 
	 */
	public static void main(String[] args) {

		MessageQueue queue = new MessageQueue();
		
		Producer wQ1 = new Producer(queue);
		Producer wQ2 = new Producer(queue);
	  
		Consumer rQ1 = new Consumer(queue);
		Consumer rQ2 = new Consumer(queue);
		Consumer rQ3 = new Consumer(queue);
	  
		Thread threadWQ1 = new Thread(wQ1, "thread-wQ1");
		Thread threadWQ2 = new Thread(wQ2, "thread-wQ2");

		Thread threadRQ1 = new Thread(rQ1, "thread-rQ1");
		Thread threadRQ2 = new Thread(rQ2, "thread-rQ2");
		Thread threadRQ3 = new Thread(rQ3, "thread-rQ3");
	  
		threadWQ1.start();
		threadWQ2.start();
	  
		threadRQ1.start();
		threadRQ2.start();
		threadRQ3.start();
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值