Java并发多线程编程——生产者消费者模式示例(传统版本)

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发多线程编程——生产者消费者模式示例(传统版本)相关的知识,希望对你有一定的参考价值。

一、生产者消费者模式示例代码

  • 示例需求

    一个初始值为0的变量 两个线程交替操作 一个加1 一个减1 每个线程遍历5
  • 示例代码

    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    /**
     * 共享资源类
     */
    class ShareData
        //一个初始值为0的变量
        private int num =0;
    
        private Lock lock=new ReentrantLock();
        private Condition condition =lock.newCondition();
    
        //变量+1方法
        public void increment() throws Exception 
            //加锁
            lock.lock();
            try 
                //判断
                while(num !=0)
                    //等待 不生产
                    condition.await();
                
                //生产
                num++;
                System.out.println(Thread.currentThread().getName()+"递增," + "\\t" + "数量:"+num);
                //通知唤醒
                condition.signalAll();
            finally 
                //解锁
                lock.unlock();
            
        
        //变量-1方法
        public void decrement() throws Exception 
            //加锁
            lock.lock();
            try 
                //判断
                while(num ==0)
                    //等待 不生产
                    condition.await();
                
                //减产
                num--;
                System.out.println(Thread.currentThread().getName()+"递减," + "\\t" + "数量:"+num);
                //通知唤醒
                condition.signalAll();
            finally 
                //解锁
                lock.unlock();
            
        
    
    
    /**
     * @description: 生产者消费者模式示例代码(传统版)
     *               一个初始值为0的变量 两个线程交替操作 一个加1 一个减1 每个线程遍历5轮
     * @author: xz
     */
    public class ProdConsumerTraditionDemo 
        public static void main(String[] args) 
            ShareData shareData = new ShareData();
            //A线程调用变量+1方法
            new Thread(() -> 
                for (int i = 1; i <= 5; i++) 
                    try 
                        shareData.increment();
                     catch (Exception e) 
                        e.printStackTrace();
                    
                
            , "A线程").start();
    
            //B线程调用变量-1方法
            new Thread(() -> 
                for (int i = 1; i <= 5; i++) 
                    try 
                        shareData.decrement();
                     catch (Exception e) 
                        e.printStackTrace();
                    
                
            , "B线程").start();
    
        
    
    
  • 输出结果如下图:

以上是关于Java并发多线程编程——生产者消费者模式示例(传统版本)的主要内容,如果未能解决你的问题,请参考以下文章

java 多线程并发系列之 生产者消费者模式的两种实现

Java并发编程--6.Exchanger线程间交换数据

多线程-并发编程-生产者消费者模式及非阻塞队列与阻塞队列实现

JUC并发编程 多线程设计模式 -- 异步模式之生产者/消费者

Java多线程之并发协作生产者消费者设计模式

Java多线程之并发协作生产者消费者设计模式