【线程(1),一文详解

这是一个Java实现的生产者消费者模型,利用循环数组和锁机制协调生产者线程和消费者线程。当队列满时,生产者会被阻塞;当队列空时,消费者会被阻塞。代码中通过wait()和notify()方法进行线程间的同步。此外,文章还提到了面试准备和部分Java面试题。
摘要由CSDN通过智能技术生成

代码实现


 import java.util.concurrent.TimeUnit;



//使用循环数组实现生产者消费者模型

public class ThreadDemo18 {

    //Java里面的数组需要初始化容量,因为目前不知道,使用根据用户输入来决定

    int[] items = null;

    int first;//队首元素下标——出列的时候会用到

    int last;//队尾元素下标——入队的时候会用到

    int size;//实际存储容量



    //初始化,传一个容量参数

    public ThreadDemo18(int cap){

        items = new int[cap];

        first = 0;

        last  = 0;

        size = 0;

    }



    //创建一把锁

    Object lock = new Object();

    //实现入队方法put()操作

    public synchronized void put(int val) throws InterruptedException {

        //需要给lock加一把锁

        synchronized (lock) {

            //首先判断队列是否已经满了,满了就说明生产者生产的太快了,那么此时就需要阻塞等待

            if (size == items.length) {

                System.out.println("生产者阻塞了"+Thread.currentThread().getName());

                //阻塞等待,首先需要有一把琐,然后使用wait方法

                //之后用notify唤醒,也就是释放锁,但是前提是要给lock加一把锁

                //然后等消费者消费了一条数据之后唤醒,也就是再pop操作下唤醒

                lock.wait();

            }

            //每次存放再last的位置,并且last++,size++

            items[last++] = val;

            size++;

            //不能够一直存放数据,要判断队列是否已经被放满

            if (last >= items.length) {

                //队列放满,此时然last的位置置为0;

                last = 0;

            }

            //此时说明已经添加数据,入队列了,所以此时唤醒消费操作

            lock.notify();

        }

    }



    //实现出队操作

    public int pop() throws InterruptedException {

        synchronized (lock) {

            int ret = -1;

            //出队之前,判断队列是否为空

            if (size <= 0) {

                System.out.println("消费者阻塞了"+Thread.currentThread().getName());

                //此时消费者消费的太快,需要阻塞等待

                //然后等待生产者生产了一条数据之后再唤醒消费动作,

                lock.wait();

            }

            //此时队列不为空,然后出队顶元素,first++,size--

            ret = items[first++];

            size--;

            //判断如果first的下标已经是最后一个了,需要将first置为0

            if (first > items.length) {

                first = 0;

            }

            //走到这一步此时表示已经出队列了,说明就应该唤醒生产者继续生产数据了

            lock.notify();

            return ret;

        }

    }

    public static void main(String[] args) {

        ThreadDemo18 threadDemo18 = new ThreadDemo18(100);

        //创造第一个生产者

        Thread  t1 = new Thread(()->{

            while (true){

                try {

                    //生产数据

                    threadDemo18.put(1);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

            }

        });

        t1.start();

        //创建一个消费者

        Thread t2 = new Thread(()->{

            while (true){

                try {



# **写在最后**

为了这次面试,也收集了很多的面试题!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

以下是部分面试题截图

 (true){

                try {



# **写在最后**

为了这次面试,也收集了很多的面试题!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

以下是部分面试题截图

![Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此](https://img-blog.csdnimg.cn/img_convert/3f90ed90c526671889485f5c128cf89e.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值