zoukankan      html  css  js  c++  java
  • 多线程-生产者消费者(lock同步)

    二、采用Lock锁以及await和signal方法是实现

    import java.io.IOException;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author 作者 E-mail:
     * @version 创建时间:2015-10-23 下午04:08:39 类说明
     */
    public class AwaitAndSignal
    {
        public static void main(String[] args) throws IOException
        {
            Person person = new Person();
            new Thread(new Consumer(person), "消费者一").start();
            new Thread(new Consumer(person), "消费者二").start();
            new Thread(new Consumer(person), "消费者三").start();
    
            new Thread(new Producer(person), "生产者一").start();
            new Thread(new Producer(person), "生产者一").start();
            new Thread(new Producer(person), "生产者一").start();
        }
    }
    
    class Producer implements Runnable
    {
        private Person person;
    
        public Producer(Person person)
        {
            this.person = person;
        }
    
        @Override
        public void run()
        {
    
            for (int i = 0; i < 10; i++)
            {
                person.produce();
            }
    
        }
    
    }
    
    class Consumer implements Runnable
    {
    
        private Person person;
    
        public Consumer(Person person)
        {
            this.person = person;
        }
    
        @Override
        public void run()
        {
    
            for (int i = 0; i < 10; i++)
            {
                person.consume();
            }
    
        }
    
    }
    
    class Person
    {
        private int foodNum = 0;
    
        private ReentrantLock lock = new ReentrantLock();
    
        private Condition condition = lock.newCondition();
    
        private final int MAX_NUM = 5;
    
        public void produce()
        {
            lock.lock();
            try
            {
                while (foodNum == MAX_NUM)
                {
                    System.out.println("box is full,size = " + foodNum);
                    condition.await();
                }
                foodNum++;
                System.out.println("produce success foodNum = " + foodNum);
                condition.signalAll();
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            } finally
            {
                lock.unlock();
            }
    
        }
    
        public void consume()
        {
            lock.lock();
            try
            {
                while (foodNum == 0)
                {
                    System.out.println("box is empty,size = " + foodNum);
                    condition.await();
                }
                foodNum--;
                System.out.println("consume success foodNum = " + foodNum);
                condition.signalAll();
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            } finally
            {
                lock.unlock();
            }
    
        }
    }
    
  • 相关阅读:
    Oracle Linux 6.1 说明
    Oracle Golden Gate 系列 小结
    Oracle 执行计划 提示 'PLAN_TABLE' is old version 解决方法
    Oracle 聚合函数(Aggregate Functions)说明
    Oracle 11g 行列互换 pivot 和 unpivot 说明
    Oracle 聚合函数(Aggregate Functions)说明
    MySQL 数据文件 说明
    MySQL 启动故障 处理 小记
    Oracle Validated Configurations 安装使用 说明
    Oracle DBMS_STATS 包 和 Analyze 命令的区别
  • 原文地址:https://www.cnblogs.com/Andrew520/p/8884003.html
Copyright © 2011-2022 走看看