生產者與消費者模式之燒餅店鋪

       生產者與消費者模式是Java線程同步問題中的一個非常經典的例子,以一個故事開始:

       話說,在江南的一個小鎮上,有一個燒餅鋪,這兒的老闆人做燒餅堪稱一絕,非常好吃,
最重要的是他人不僅長得帥,而且善良大方,鎮上的人都喜歡來店鋪吃燒餅,燒餅鋪美名滿天下。
       這天風和日麗,鳥語花香,一切都是那麼美好。突然,來個三個人,第一個叫屬驢,第二個叫田小四,第三個老羊。
屬驢這人,黑如李逵,瘦如妖猴,但是肚子出奇的大,一看就是能吃的人,但是爲啥瘦如妖猴就不得而知了...
田小四這兒看起來肥頭大耳,長了一個豬鼻子,嘴巴出奇的大,吃東西肯定相當快...

老羊這人身穿一件黃大袍,手提琅琊榜,牙齒長的厲害,能碰到下巴...

看的出來他們都非常能吃,並且好像已經很久沒有吃飯了。這下可把燒餅鋪的老闆愛心斯坦 忙壞了... ...

  • 生產者:Producer.java
import java.util.List;
/**
 * 生產者
 * @author GengYB
 *
 */
public class Producer extends Thread {
	private List<Object> continer; //裝燒餅的籃子
	
	public Producer(List<Object> con) {
		super();
		this.continer = con;
	}
	
	@Override
	public void run() {
		super.run();
		int i = 1;
		//循環生產燒餅
		while(true) {
			String s1 = new String("燒餅"+(i++));
			continer.add(s1);
			synchronized (continer) {
				System.out.println(Thread.currentThread().getName()+"說:一個燒餅出爐了~");
				continer.notify();//發出通知
			}
			try {
				Thread.sleep(1000); //一秒生產一個燒餅
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
  • 消費者:Customer.java
import java.util.List;
/**
 * 
 * @author GengYB
 * 消費者
 *
 */
public class Customer extends Thread {
	private List<Object> container; //裝燒餅的籃子

	public Customer(List<Object> con) {
		super();
		this.container = con;
	}

	@Override
	public void run() {
		super.run();
		while (true) {
			synchronized (container) {
				if (container.size() == 0) {
					System.out.println(Thread.currentThread().getName() + "說:快點,餓死了!");
					try {
						container.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					Object remove = container.remove(0);
					System.out.println(Thread.currentThread().getName() + "吃掉出爐的" + remove);
				}
			}
		}
	}
}
  • 測試代碼:Main.java
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Scanner;
/**
 * 燒餅店鋪(test)
 * @author Administrator
 *
 */
public class Main {
	public static void main(String[] args) throws IOException {
		getStory();
		LinkedList<Object> container = new LinkedList<Object>();//裝燒餅的籃子
		Customer c1 = new Customer(container); //吃燒餅的胖子
		c1.setName("屬驢");
		Customer c2 = new Customer(container);
		c2.setName("田小四");
		Customer c3 = new Customer(container);
		c3.setName("老羊");
		c1.start();
		c2.start();
		c3.start();
		
		
		Producer producer = new Producer(container);
		producer.setName("燒餅鋪,愛心斯坦");
		producer.start(); //開始做燒餅
	}
	
	private static void getStory() throws IOException {
		FileInputStream fis = new FileInputStream("./story.dat");
		InputStreamReader isr = new InputStreamReader(fis,"utf-8");
		BufferedReader br = new BufferedReader(isr);
		
		String line;
		while((line = br.readLine())!=null) {
			System.out.println(line);
			try {     
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		br.close();
		System.out.println("按Enter繼續....");
		Scanner in = new Scanner(System.in);
		String nextLine = in.nextLine();
		System.out.println(nextLine);
		in.close();
	}
}
  • 故事劇情:./story.dat
 話說,在江南的一個小鎮上,有一個燒餅鋪,這兒的老闆人做燒餅堪稱一絕,非常好吃,
最重要的是他人不僅長得帥,而且善良大方,鎮上的人都喜歡來店鋪吃燒餅,燒餅鋪美名滿天下。
   這天風和日麗,鳥語花香,一切都是那麼美好。突然,來個三個人,第一個叫屬驢,第二個叫田小四,第三個老羊。
屬驢這人,黑如李逵,瘦如妖猴,但是肚子出奇的大,一看就是能吃的人,但是爲啥瘦如妖猴就不得而知了...
田小四這兒看起來肥頭大耳,長了一個豬鼻子,嘴巴出奇的大,吃東西肯定相當快...
老羊這人身穿一件黃大袍,手提琅琊榜,牙齒長的厲害,能碰到下巴...
看的出來他們都非常能吃,並且好像已經很久沒有吃飯了。這下可把燒餅鋪的老闆愛心斯坦 忙壞了... ...
............


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章