zoukankan      html  css  js  c++  java
  • 多生产者多消费者(第一种方式),基于synchronized,wait,notifyAll

    生产者消费者模式描述的是协调与协作关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)如果桌子空了的话就等待

    采用生产者消费者模式可以做到异步,解耦的目的。

    public class Produce implements Runnable {
    
        public Object lock;
        public LinkedList<String> list;
        
        private volatile boolean isRunning = true;
    
        private static AtomicInteger count = new AtomicInteger();
        
        public Produce(Object object, LinkedList<String> list) {
            this.lock = object;
            this.list = list;
        }
    
        @Override
        public void run() {
            try {
                while (isRunning) {
                    Thread.sleep(1000);
                    synchronized (lock) {
                        while (list.size() >= 5) {
                            System.out.println(Thread.currentThread().getName() + " 正在等待 ");
                            lock.wait();
                        }
                        String value = "data:"+count.getAndIncrement();
                        list.offerLast(value);
                        System.out.println(Thread.currentThread().getName() + " 生产数据 "+ value);
                        lock.notifyAll();
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    
        public void stop() {
            isRunning = false;
        }
    }
    public class Consumer implements Runnable {
    
        private volatile boolean isRunning = true;
    
        public Object lock;
    
        public LinkedList<String> list;// 用list存放生产之后的数据,最大容量为1
    
        public Consumer(Object object, LinkedList<String> list ) {
            this.lock = object;
            this.list = list;
        }
    
        @Override
        public void run() {
            try {
                while (isRunning) {
                    synchronized (lock) {
                        while (list.isEmpty()) {
                            System.out.println(Thread.currentThread().getName() + " 正在等待");
                            lock.wait();
                        }
                        String value = list.pollFirst();
                        System.out.println(Thread.currentThread().getName() + " 消费数据 >>"+ value);
                        lock.notifyAll();// 
                    }
                    Thread.sleep(2000);
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    
        public void stop() {
            isRunning = false;
        }
    }
    public class Client {
    
        public static void main(String[] args) {
    
            Object lock = new Object();
            LinkedList<String> list = new LinkedList<String>();
    
            IntStream.range(1, 4).forEach(i -> new Thread(new Produce(lock, list), "【生产者" + i + "").start());
    
            IntStream.range(1, 3).forEach(i -> new Thread(new Consumer(lock, list), "【消费者" + i + "").start());
        }
    
    }
  • 相关阅读:
    迁移MSSQL实例的所有login(包含密码)
    某公司的存储过程模板(摘抄自高大神的博客)
    检测和终结死锁
    70-461学习笔记,关于几个日期函数
    Oracle-12541:TNS:无监听程序 .
    C#- 实用的Log4Net日志记录例子
    EASYUI- EASYUI左移右移 GRID中值
    MYSQL- 分页存储过程
    MSSQLSERVER数据库- 一条代码搞定单表备份表结构和表数据
    Delphi- 操作EXCEL
  • 原文地址:https://www.cnblogs.com/moris5013/p/10913261.html
Copyright © 2011-2022 走看看