zoukankan      html  css  js  c++  java
  • 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();
            }
        }
    }
    

      

  • 相关阅读:
    js菜单特效分享(1)
    用泛型的IEqualityComparer接口去重复项 .
    jquery一些有用的插件
    JQuery Tree插件——zTree v3.0 beta 发布
    泛型和linq
    js如何隐藏表格的行与列
    34个漂亮的应用程序后台管理界面
    解决Visual Studio setup cannot run in compatibility mode的错误
    html文本框(input)不保存缓存记录
    第九章:第九章:XML文档集成Axd向导
  • 原文地址:https://www.cnblogs.com/smartsmile/p/11608415.html
Copyright © 2011-2022 走看看