web 初始 12

在这里插入代码片
昨天真不能怪我,一群熊娃娃把水往电箱里泼,你能把人怎么滴?
所以咱们以后有了后代绝对得言传身教,不能跟这一般,抓紧时间好好学习,给后代一个有素质的教育环境。
学习开始!
我知道长时间的板述会令人焦灼,因为我自己也是个学生,那么今天搞点别的花样,直接给一段代码,然后我从头到尾分析一遍,包括意思和意义,由于第一次直接自己怼代码,论经验还是拿不出台面,走过路过的人看见有错请指正:
阻塞式队列(生产者-消费者模型):
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的(一下子想起了高中生物,怀念啊~~)
看不懂啥意思没关系,官方概念一次能看懂那就不叫“官方”了。
上码!

在这里插入代码片
import java.util.Random;
public class MessageQueue { //新单词MessageQueue,消息队列,提供必要数据
private int[] items;  //用于存放阻塞队列的数组
private int putIndex;  //生产者序列
private int takeIndex; //消费者序列
private volatile int size;   //队列大小
public MessageQueue(int capacity) { //类的构造方法(生产数据初始化)
items = new int[capacity];
putIndex = 0;
takeIndex = 0;
size = 0;
}
比特科技
public void put(int message) throws InterruptedException {  //生产者
do {
synchronized (this) {  //锁定this指向对象,(this关键字通常出现在构造方法中,而此处构造方法即是需要阻塞的队列)阻塞线程队列
if (size < items.length) {  //在队列大小小于数组长度的前提下,将队列扩大并陆续存入数组
items[putIndex] = message;  
putIndex = (putIndex + 1) % items.length;  //生产者序列大小确定  
size++;   //该数据将会被返回到构造方法(阻塞队列)中
notifyAll();  //唤醒所有线程
return;
}
}
while (size == items.length) {  //当队列刚好占满数组时,再次使线程阻塞,确认线程是否运行(若运行则数组不可能占满),再次确认生产完所有数据,则停止该线程(停止生产)
synchronized (this) {
if (size == items.length) {
wait();  //停止线程运行
}
}
}
} while (true);
}
public int take() throws InterruptedException {  //消费者
do {   //同上,锁定this指向对象
synchronized (this) {
if (size > 0) {  //调用由生产者提供给阻塞队列的数据,在数据没被取完之前唤醒所有线程
int message = items[takeIndex];//取出和存入,刚好相反,此处为从数组中取出
takeIndex = (takeIndex + 1) % items.length;
size--;
notifyAll();
return message; //消费多少数据将被返回
}
}
while (size == 0) {   //当队列刚好被从数组中全部取出后,再次锁定使线程阻塞,然后确认线程是否运行(若运行则数组不可能为空),再次确认消费完所有数据,则停止线程运行(停止消费)
synchronized (this) {
if (size == 0) { //停止线程运行
wait();
}
}
}
} while (true);  
}
public synchronized int size() {
return size;  //记录阻塞队列中生产消费数据大小
}
public static void main(String[] args) {
MessageQueue queue = new MessageQueue();  //创建队列对象
Thread producer = new Thread(() -> {     //创建线程对象,对应生产者
 Random random = new Random();  //创建随机对象
for (int i = 0; i < 100_0000_0000; i++) {
queue.put(random.nextInt(100000);  //对队列使用生产方法,内容随便生产(验证方法无需具体数据)
}
}, "生产者");
Thread customer = new Thread(() -> { //另创建一个线程对象,对应消费者
while (true) {
int message = queue.take();  //对队列使用消费方法
System.out.println(message);  //展示随机队列内容
}
}, "消费者");

在这里插入代码片
希望会有大佬来给纠错,以我自己敲代码的经验看来,肯定有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值