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();
            }
    
        }
    }
    
  • 相关阅读:
    两台电脑之间怎么用一根网线传输数据
    IDEA的几个常用配置,日常开发必备
    idea 配置Maven
    IDEA2019 安装和激活
    HTML中各类空格占位符
    jackSon注解-- @JsonInclude 注解不返回null值字段
    Vscode配置Eslint
    Tomcat中容器是什么以及容器与容器之间的数量关系。
    请求是如何传递给StandardEngine的?
    Java中一个线程只有六个状态。至于阻塞、可运行、挂起状态都是人们为了便于理解,自己加上去的。
  • 原文地址:https://www.cnblogs.com/Andrew520/p/8884003.html
Copyright © 2011-2022 走看看