生產者與消費者模式是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
話說,在江南的一個小鎮上,有一個燒餅鋪,這兒的老闆人做燒餅堪稱一絕,非常好吃,
最重要的是他人不僅長得帥,而且善良大方,鎮上的人都喜歡來店鋪吃燒餅,燒餅鋪美名滿天下。
這天風和日麗,鳥語花香,一切都是那麼美好。突然,來個三個人,第一個叫屬驢,第二個叫田小四,第三個老羊。
屬驢這人,黑如李逵,瘦如妖猴,但是肚子出奇的大,一看就是能吃的人,但是爲啥瘦如妖猴就不得而知了...
田小四這兒看起來肥頭大耳,長了一個豬鼻子,嘴巴出奇的大,吃東西肯定相當快...
老羊這人身穿一件黃大袍,手提琅琊榜,牙齒長的厲害,能碰到下巴...
看的出來他們都非常能吃,並且好像已經很久沒有吃飯了。這下可把燒餅鋪的老闆愛心斯坦 忙壞了... ...
............