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