JAVA並發實現五(生產者和消費者模式wait和notify方式實現)


package com.subject01;

import java.util.PriorityQueue;

/**
 * 通過wait和notify 實現
 * 生產者-消費者模型:當隊列滿時,生產者需要等待隊列有空間才能繼續往里面放入商品,而在等待的期間內,
 * 			生產者必須釋放對臨界資源(即隊列)的占用權。因為生產者如果不釋放對臨界資源的占用權,
 * 			那么消費者就無法消費隊列中的商品,就不會讓隊列有空間,那么生產者就會一直無限等待下去。
 * 			因此,一般情況下,當隊列滿時,會讓生產者交出對臨界資源的占用權,並進入掛起狀態。
 * 			然后等待消費者消費了商品,然后消費者通知生產者隊列有空間了。
 * 			同樣地,當隊列空時,消費者也必須等待,等待生產者通知它隊列中有商品了。這種互相通信的過程就是線程間的協作。
 * com.subject01.CusAndPro.java
 * @author 孫濤
 * 2016年5月10日
 */
public class CusAndPro {

	private int queueSize = 10 ;
	private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
	
	public static void main(String[] args) {
		CusAndPro cap = new CusAndPro();
		Consumer cus = cap.new Consumer();
		Producer pro = cap.new Producer();
		Thread cusT = new Thread(cus);
		Thread proT = new Thread(pro);
		
		proT.start();
		cusT.start();
	}
	/**
	 * 消費者
	 * com.subject01.CusAndPro.java
	 * @author 孫濤
	 * 2016年5月10日
	 */
	class Consumer implements Runnable{

		@Override
		public void run() {
			cousume();
		}

		private void cousume() {
			while(true){
				synchronized (queue) {
					while(queue.size() ==0){
						try {
							System.out.println("隊列空,等待數據。。。");
							queue.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
							queue.notify();
						}
					}
					
					queue.poll() ;
					queue.notify();
					System.out.println("從隊列中取走一個元素,隊列中剩余"+queue.size()+"個");
				}
			}
		}
		
	}
	/**
	 * 生產者
	 * com.subject01.CusAndPro.java
	 * @author 孫濤
	 * 2016年5月10日
	 */
	class Producer implements Runnable{

		@Override
		public void run() {
			produce();
		}

		private void produce() {
			while(true){
				synchronized(queue){
					while(queue.size() == queueSize){
						try {
							System.out.println("隊列已滿,等待空余的空間");
							queue.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
							queue.notify();
						}
					}
					
					queue.offer(1);   // 每次插入一個元素
					queue.notify();
					System.out.println("向隊列取中插入一個元素,隊列剩余空間:"+(queueSize-queue.size()));
				}
			}
		}
		
	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM