多线程-生产者消费者(3)总结

针对生产者-消费者模型编程几种写法

生产者消费者有进行同步加锁的

(1)整个工程只有多个class文件的,也就是Producer类和Consumer类分开写的。

参见http://www.cnblogs.com/Andrew520/p/8881635.html 或者http://www.cnblogs.com/Andrew520/p/8884003.html

此时必须保证是同一把锁,因此锁的创建放在producer和consumer共同的数据模型中。此时producer()和consumer()的实现代码是放在同一个class文件中的,也就是Person类中。

Producer类和Consumer类中只是在run()方法中调用了producer()和consumer()方法。

(2)整个工程只有一个class文件的。此时Producer类和Consumer类是内部类。此时锁的创建就比较简单,放在主类中就可以了 参见http://www.cnblogs.com/Andrew520/p/8962403.html

//具体实现代码如下:
public class ProducerConsumer {

    private LinkedList<Object> storeHouse = new LinkedList<Object>();

    private int MAX = 2;

    // 调用生产者和消费者
    public void start() {
        new Comsumer().start();
        new Producer().start();
    }

    // 生产者,是一个线程,用来给集合添加商品
    class Producer extends Thread {
        public void run() {
            while (true) {
                synchronized (storeHouse) {
                    try {
                        if (storeHouse.size() == MAX) {
                            System.out.println("集合已满,生产者线程将要等待!");
                            // 导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在
                            // 同步方法中调用。如果当前线程不是锁的持有者
                            storeHouse.wait();
                        } else {
                            storeHouse.add(new Object());
                            System.out.println("添加了一个商品到缓存中,并且唤醒消费者线程!");
                            Thread.sleep(1000);
                            // 唤醒消费者线程
                            storeHouse.notify();
                        }
                    } catch (InterruptedException ie) {
                        System.out.println("producer is interrupted!");
                    }

                }
            }
        }
    }

    class Comsumer extends Thread {
        public void run() {
            while (true) {
                synchronized (storeHouse) {
                    try {
                        if (storeHouse.size() == 0) {
                            System.out.println("集合已空,消费者线程将要等待!");
                            storeHouse.wait();
                        } else {
                            // 消费产品
                            storeHouse.removeLast();
                            System.out.println("消费者消费了一个商品,并且唤醒生产者线程");
                            Thread.sleep(1000);
                            storeHouse.notify();
                        }
                    } catch (InterruptedException ie) {
                        System.out.println("Consumer is interrupted");
                    }

                }
            }

        }
    }

    public static void main(String[] args) throws Exception {
        ProducerConsumer producerConsumer = new ProducerConsumer();
        producerConsumer.start();
    }
}

 

生产者消费者没有进行同步或者加锁的

这种比较简单,无论是一个class文件或者多个分开写都可以。

posted @ 2018-04-27 15:16  Andrew_F  阅读(468)  评论(0编辑  收藏  举报