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文件或者多个分开写都可以。

  • 相关阅读:
    requests.session()发送请求 和使用requests直接发送请求的区别
    axios请求接口如何将data转换formdata?
    yaml简单使用
    Appium-send_keys 无法写入?
    Appium-滑动操作
    Appium -appium desktop工具使用
    Appium学习笔记(2)adb常用命令
    Appium学习笔记(1)appium配置-起步
    Django学习笔记(20)celery_tasks 异步任务初识
    Django学习笔记(19)HttpResponse/JsonResponse /render /redirect/Http404
  • 原文地址:https://www.cnblogs.com/Andrew520/p/8962563.html
Copyright © 2011-2022 走看看