• Java 多线程之生产者消费者(多个生成者多个消费者)synchronized 和lock多线程通讯和同步实现


    public class ProducterConsumerSample {
        public static void main(String[] args) {
            Resourse res = new Resourse();
            //两个生产者
            Producter producter1 = new Producter(res);
            Producter producter2 = new Producter(res);
            //三个消费者
            Consumer consumer1 = new Consumer(res);
            Consumer consumer2 = new Consumer(res);
            Consumer consumer3 = new Consumer(res);
    
            Thread t1 = new Thread(producter1);
            Thread t2 = new Thread(producter2);
            Thread t3 = new Thread(consumer1);
            Thread t4 = new Thread(consumer2);
            Thread t5 = new Thread(consumer3);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            t5.start();
            /**
             * 显示如下
             * Thread-1 生产者 ++ 苹果手机---1
             * Thread-2 消费者 苹果手机---1
             * Thread-0 生产者 ++ 苹果手机---2
             * Thread-2 消费者 苹果手机---2
             * Thread-0 生产者 ++ 苹果手机---3
             * Thread-2 消费者 苹果手机---3
             * Thread-0 生产者 ++ 苹果手机---4
             * Thread-2 消费者 苹果手机---4
             * Thread-0 生产者 ++ 苹果手机---5
             * Thread-2 消费者 苹果手机---5
             * Thread-0 生产者 ++ 苹果手机---6
             * Thread-2 消费者 苹果手机---6
             * Thread-0 生产者 ++ 苹果手机---7
             * Thread-2 消费者 苹果手机---7
             * Thread-0 生产者 ++ 苹果手机---8
             * Thread-2 消费者 苹果手机---8
             * Thread-0 生产者 ++ 苹果手机---9
             * Thread-2 消费者 苹果手机---9
             * Thread-0 生产者 ++ 苹果手机---10
             * Thread-2 消费者 苹果手机---10
             */
        }
    }
    
    class Resourse {
        private int productId = 1;
        private String productName;
        private boolean flag = false;
    
        /**
         * 同步函数,解决多线程操作时的安全问题
         */
        public synchronized void product(String productName) {
            while (flag) {  //关键点 此处一定要用while循环
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.productName = productName + "---" + productId++;
            System.out.println(Thread.currentThread().getName() + " 生产者 ++ " + this.productName);
            flag = true;
            this.notifyAll(); //关键点 此处一定要把所有wait线程全部唤醒
        }
    
        /**
         * 同步函数,解决多线程操作时的安全问题
         */
        public synchronized void consume() {
            while (!flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + " 消费者 " + this.productName);
            flag = false;
            this.notifyAll();
        }
    }
    
    class Producter implements Runnable {
    
        private Resourse res;
    
        Producter(Resourse res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            while (true) {
                res.product("苹果手机");
            }
        }
    }
    
    class Consumer implements Runnable {
    
        private Resourse res;
    
        Consumer(Resourse res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            while (true) {
                res.consume();
            }
        }
    }
    
    import java.io.PrintStream;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * 使用lock实现多线程之间的数据通讯和同步
     */
    public class ProducterConsumerSample {
        public static void main(String[] args) {
            Resourse res = new Resourse();
            //两个生产者
            Producter producter1 = new Producter(res);
            Producter producter2 = new Producter(res);
            //三个消费者
            Consumer consumer1 = new Consumer(res);
            Consumer consumer2 = new Consumer(res);
            Consumer consumer3 = new Consumer(res);
    
            Thread t1 = new Thread(producter1);
            Thread t2 = new Thread(producter2);
            Thread t3 = new Thread(consumer1);
            Thread t4 = new Thread(consumer2);
            Thread t5 = new Thread(consumer3);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            t5.start();
            /**
             * 显示如下
             * Thread-1 生产者 ++ 苹果手机---105851
             * Thread-4 消费者 苹果手机---105851
             * Thread-0 生产者 ++ 苹果手机---105852
             * Thread-2 消费者 苹果手机---105852
             * Thread-1 生产者 ++ 苹果手机---105853
             * Thread-3 消费者 苹果手机---105853
             * Thread-0 生产者 ++ 苹果手机---105854
             * Thread-4 消费者 苹果手机---105854
             * Thread-1 生产者 ++ 苹果手机---105855
             * Thread-2 消费者 苹果手机---105855
             * Thread-0 生产者 ++ 苹果手机---105856
             * Thread-3 消费者 苹果手机---105856
             */
        }
    }
    
    class Resourse {
        private int productId = 1;
        private String productName;
        private boolean flag = false;
        private final Lock lock = new ReentrantLock();
        private Condition condition_pro = lock.newCondition();  //生产者Condition
        private Condition condition_Cons = lock.newCondition(); //消费者Condition
    
        public void product(String productName) {
            lock.lock();  //加锁
            try {
                while (flag) {  //关键点 此处一定要用while循环
                    try {
                        condition_pro.await(); //生产者等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                this.productName = productName + "---" + productId++;
                System.out.println(Thread.currentThread().getName() + " 生产者 ++ " + this.productName);
                flag = true;
                condition_Cons.signal(); //唤醒消费者
            } finally {
                lock.unlock(); //解锁
            }
        }
    
        public void consume() {
            lock.lock();  //加锁
            try {
                while (!flag) {
                    try {
                        condition_Cons.await(); //消费者等待
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " 消费者 " + this.productName);
                flag = false;
                condition_pro.signal(); //唤醒生产者
            } finally {
                lock.unlock(); //解锁
            }
        }
    }
    
    class Producter implements Runnable {
    
        private Resourse res;
    
        Producter(Resourse res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            while (true) {
                res.product("苹果手机");
            }
        }
    }
    
    class Consumer implements Runnable {
    
        private Resourse res;
    
        Consumer(Resourse res) {
            this.res = res;
        }
    
        @Override
        public void run() {
            while (true) {
                res.consume();
            }
        }
    }
    

      

  • 相关阅读:
    Stream 常规操作
    Stream Introduction
    那些从阿里巴巴走出的创业牛人们
    码农转型传统行业更容易成功?
    创业者怎么讲故事打动投资人?
    李明远:移动互联网的创业时代
    想当年,那些抄我们试卷的坏分子,如今个个都当了老板.
    为什么说淘宝创业已难赚钱?
    让低版本IE支持Html5的新语义标签
    译文:TypeScript新手指南
  • 原文地址:https://www.cnblogs.com/smartsmile/p/11608415.html
Copyright © 2020-2023  润新知