生产者与消费者模式是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
话说,在江南的一个小镇上,有一个烧饼铺,这儿的老板人做烧饼堪称一绝,非常好吃,
最重要的是他人不仅长得帅,而且善良大方,镇上的人都喜欢来店铺吃烧饼,烧饼铺美名满天下。
这天风和日丽,鸟语花香,一切都是那么美好。突然,来个三个人,第一个叫属驴,第二个叫田小四,第三个老羊。
属驴这人,黑如李逵,瘦如妖猴,但是肚子出奇的大,一看就是能吃的人,但是为啥瘦如妖猴就不得而知了...
田小四这儿看起来肥头大耳,长了一个猪鼻子,嘴巴出奇的大,吃东西肯定相当快...
老羊这人身穿一件黄大袍,手提琅琊榜,牙齿长的厉害,能碰到下巴...
看的出来他们都非常能吃,并且好像已经很久没有吃饭了。这下可把烧饼铺的老板爱心斯坦 忙坏了... ...
............
