您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 1浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

小志的博客 发布时间:2022-01-18 22:24:34 ,浏览量:1

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

    一个初始值为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  {
                for (int i = 1; i             
关注
打赏
1661269038
查看更多评论
0.0416s