zoukankan      html  css  js  c++  java
  • 多线程-生产者消费者(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文件或者多个分开写都可以。

  • 相关阅读:
    spring jdbcTemplate使用queryForList示例
    凡事预则立,不立则废:好计划是成功的开始——布利斯定理
    传世智库:初识IPD-集成产品开发
    骑手送外卖获奖1500多万元又被撤销 法律专家:不能一扣了之
    leetcode-----129. 求根到叶子节点数字之和
    leetcode-----128. 最长连续序列
    leetcode-----127. 单词接龙
    leetcode-----126. 单词接龙 II
    leetcode-----125. 验证回文串
    leetcode-----124. 二叉树中的最大路径和
  • 原文地址:https://www.cnblogs.com/Andrew520/p/8962563.html
Copyright © 2011-2022 走看看