ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JUC练习2——java生产者消费者demo

2022-01-10 23:04:15  阅读:152  来源: 互联网

标签:JUC java int demo number util locks import


以下的代码示例:先使用了synchronized关键字来实现生产者消费者,而后使用了JUC中的lock及其condition来实现生产者消费者

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class JucTest1
{
    public static void main(String[] args)
    {
        Ticket ticket = new Ticket();
        for (int i=0;i<4;i++)
        {
            new Thread(()->
            {
                try {
                    for (int j=0;j<10;j++)
                    {
                        ticket.produce();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"A"+i).start();
            new Thread(()->
            {
                try {
                    for (int j=0;j<10;j++)
                    {
                        ticket.consumer();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"B"+i).start();
        }

        JUCTicket jucTicket = new JUCTicket();
        for (int i=0;i<4;i++)
        {
            new Thread(()->
            {
                for (int j=0;j<10;j++)
                {
                    jucTicket.produce();
                }
            },"C"+i).start();
            new Thread(()->
            {
                for (int j=0;j<10;j++)
                {
                    jucTicket.consumer();
                }
            },"D"+i).start();
        }
    }
}
//使用synchronized来模拟生产者消费者问题
class Ticket
{
    private int number = 0;
    //使用synchronized来实现并发,synchronized可以锁当前对象
    synchronized void produce() throws InterruptedException {
        //如果使用if判断存在虚假唤醒问题,也就是两个线程同时进入,所以我们一般把等待的内容放到where中
        while (number != 0)
        {
            //等待消费者消费
            this.wait();
        }
        number++;
        System.out.println(Thread.currentThread().getName()+"生产后,number="+number);
        //通知其它线程我生产完成了
        this.notifyAll();
    }

    synchronized void consumer() throws InterruptedException {
        while (number == 0)
        {
            //等待生产者生产
            this.wait();
        }
        number--;
        System.out.println(Thread.currentThread().getName()+"消费后,number="+number);
        //通知其它线程我消费完成了
        this.notifyAll();
    }
}

//使用lock锁来模拟生产者消费者问题
class JUCTicket
{
    private int number = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    //condition.signalAll();相当于this.notifyAll();
    //condition.await();相当于this.wait();
    //使用synchronized来实现并发,synchronized可以锁当前对象
    void produce(){
        lock.lock();
        try
        {
            while (number != 0)
            {
                //等待消费者消费
                condition.await();
            }
            number++;
            System.out.println(Thread.currentThread().getName()+"生产后,number="+number);
            //通知其它线程我生产完成了
            condition.signalAll();
        }catch (Exception e)
        {
            e.printStackTrace();
        }finally
        {
            lock.unlock();
        }
    }

    void consumer(){
        lock.lock();
        try
        {
            while (number == 0)
            {
                //等待生产者生产
                condition.await();
            }
            number--;
            System.out.println(Thread.currentThread().getName()+"消费后,number="+number);
            //通知其它线程我生产完成了
            condition.signalAll();
        }catch (Exception e)
        {
            e.printStackTrace();
        }finally
        {
            lock.unlock();
        }
    }
}

运行的结果:生产者只能生产一个,生产后,需要等待其它消费者进行消费,消费者消费完成后通知生产继续生产

B0消费后,number=0
A0生产后,number=1
B0消费后,number=0
A1生产后,number=1
B1消费后,number=0
A0生产后,number=1
B2消费后,number=0

标签:JUC,java,int,demo,number,util,locks,import
来源: https://www.cnblogs.com/chenjianjiang/p/15786385.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有