生产者消费者模式

来源:互联网 发布:asp.net入门编程实例 编辑:程序博客网 时间:2024/05/18 00:54

有一个生产电脑的工厂,由于近来行业不景气,工厂不能大量制造电脑。每次只能生产一台电脑,等待电脑卖出去后,再生产一台电脑,等电脑卖出去后才能继续生产...(当然,我的这个举例有些生硬)。如何用程序来模拟这个场景呢?下面我用生产者消费者模式来模拟这个场景。

首先,新建一个电脑类(相当于这个电脑工厂),这个电脑有两个方法,一个生产方法和一个消费方法。

public class Computer {private String xh;//电脑型号private int price;//电脑价格private boolean flag = true;  //是否可以生产public synchronized void set(String xh,int price){if(!flag){//如果是否可以生产标识为不可生产,此时生产线程必须等待try {super.wait();} catch (InterruptedException e) {e.printStackTrace();}}try {Thread.sleep(2000);//模拟生产过程} catch (InterruptedException e) {e.printStackTrace();}System.out.println("型号:"+xh+"价格"+price+":生产中......");this.xh = xh;this.price = price;flag = false;//每当生产一个产品就将是否可以生产的标识设置为不可生产notify();//当生产完成后,需要唤醒消费线程}public synchronized void get(){if(flag){//如果是否可以生产标识为可生产,此时消费线程必须等待try {super.wait();} catch (InterruptedException e) {e.printStackTrace();}}try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("型号:"+xh+"价格"+price+":消费中......");flag = true;//每当消费一个产品就将是否可以生产的标识设置为可生产notify();//当消费完成后,需要唤醒生产线程}}
2 新建一个 生产线程


public class Producer implements Runnable{private static Computer computer;public Producer(Computer computer){this.computer = computer;}@Overridepublic void run() {for(int i=0;i<20;i++){computer.set("XXX"+new Random().nextInt(100), new Random().nextInt(100));}}}

3 新建一个消费线程

public class Consumer implements Runnable {private static Computer computer;public Consumer(Computer computer){this.computer = computer;}@Overridepublic void run() {for(int i=0;i<20;i++){computer.get();}}}

4 新建一个测试类

public class Test {public static void main(String... a){Computer computer = new Computer();Producer producer = new Producer(computer);//新建一个生产者线程Consumer consumer = new Consumer(computer);//新建一个消费者线程new Thread(producer).start();//开启生产者线程new Thread(consumer).start();//开启消费者线程}}

运行结果:

型号:XXX80价格99:生产中......
型号:XXX80价格99:消费中......
型号:XXX93价格74:生产中......
型号:XXX93价格74:消费中......
型号:XXX40价格77:生产中......
型号:XXX40价格77:消费中......
型号:XXX70价格93:生产中......
型号:XXX70价格93:消费中......

从结果可以看出,没生产一台电脑必须消费掉后才能继续生产。

需要注意几点是:

1 computer类的set (生产方法)和 get(消费方法)必须同步。

2 computer类中必须有一个flag来标识,正在是可生产。

3 在生产结束后,必须调用notify()方法,来唤醒,因得不到锁而wait()的消费线程。同理在消费结束后,也应该调用notify()方法,来唤醒,因得不到锁而wait()的生产线程。

4 当生产线程调用生产方法,如果当前电脑还没有消费掉(即flag标识为false),则生产线程必须等待。

5 当消费线程调用消费方法,如果当前电脑还没有生产(即flag标识为true),则消费线程必须等待。

原创粉丝点击