多线程-生产者消费者(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文件或者多个分开写都可以。