微信公众号怎么创建优惠券郑州seo优化公司
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:18
当前位置: 首页 > news >正文
微信公众号怎么创建优惠券,郑州seo优化公司,wordpress english,广东十大网站建设排名阻塞队列介绍标准库阻塞队列使用基于阻塞队列的简单生产者消费者模型。实现一个简单型阻塞队列 #xff08;基于数组实现#xff09; 阻塞队列介绍
不要和之前学多线程的就绪队列搞混#xff1b; 阻塞队列#xff1a;也是一个队列#xff0c;先进先出。带有特殊的功能 基于数组实现 阻塞队列介绍
不要和之前学多线程的就绪队列搞混 阻塞队列也是一个队列先进先出。带有特殊的功能 阻塞 1如果队列为空,执行出队列操作,就会阻塞阻塞到另一个线程往队列里添加元素(队列不空)为止 2如果队列满了执行入队列操作,也会阻塞阻塞到另一个线程从队列取走元素位置(队列不满)
消息队列 先简单介绍消息队列特殊的队列相当于在阻塞队列的基础上加上一个消息类型按照类别进行先进先出。 因为这个消息队列使用起来太香所以有大佬把这样的数据结构单独实现成一个程序可以单独的部署到一组服务器上。使储存、转发能力大大提升。现在已经发展可以和mysql、redis相提并论的一个重要组件。 消息队列之所以这么好用和阻塞队列阻塞特性关系非常大基于这种特性可以实现 “生产者消费者模型”
生产者消费者模型常用的并发设计模式比如包饺子一个人负责制作饺子皮一个人负责包一个人负责下锅。不会说每个人单独包一个饺子这样会导致撵面杖不够用影响效率。两个好处。 1实现发送方与接收方之间的解耦。 比如下面这种是耦合度比较高A要调用BA把请求转发给B处理B把结果反馈给AA得知道B的存在。如果B挂了很容易引起A的bug。。如果你要增加一个C服务器对A也需要修改代码对A又得重新测试等又不知道是否改动A会对B有影响。 这种模型下A、B耦合就降低很多A中无BB中无A的代码。两边有一方挂了都互相没任何影响因为阻塞队列是正常的。B挂了A仍然可以插入元素满了就阻塞。A挂了B仍然可以从队列获取元素空了就阻塞。增加一个C服务器对A是无感知的。
2削峰填谷的作用保证系统的稳定性。 服务器开发也很类似说不定坤哥唱一首只因你太美热搜瞬间上来很多用户给你发请求如果没有削峰填谷的准备服务器很容易就挂掉。
标准库阻塞队列使用 Queue提供入队列 offer 、出队列 poll、取队首元素 peek。 阻塞队列主要方法入队列 put、出队列 take。抛异常阻塞得需要唤醒空队列你再取就阻塞。阻塞队列也有offer和poll方法但是这些是不带阻塞功能的。
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.PriorityBlockingQueue;public class test14 {//标准库阻塞队列使用public static void main(String[] args) throws InterruptedException {
// BlockingDequeString qnew PriorityBlockingQueue() 基于堆带有优先级阻塞队列BlockingDequeString qnew LinkedBlockingDeque();//基于链表实现
// BlockingDequeString qnew ArrayBlockingQueue(); 基于数组实现q.put(hello);System.out.println(q.take());//输出结果helloq.take();//空的时候取就会阻塞}
}
基于阻塞队列的简单生产者消费者模型。
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;public class test15 {//基于阻塞队列生产者消费者模型static int i0;public static void main(String[] args) {BlockingDequeInteger blockingDequenew LinkedBlockingDeque();Thread t1new Thread(()-{//生产者while (true){try {blockingDeque.put(i);System.out.println(i);//生产的元素i;Thread.sleep(500);//生产的很慢消费者就得阻塞先等到元素生产出来} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();Thread t2new Thread(()-{//消费者while (true){try {System.out.println(blockingDeque.take());//消费的元素} catch (InterruptedException e) {throw new RuntimeException(e);}}});t2.start();}
}
执行效果
实现一个简单型阻塞队列 基于数组实现
先复习一下循环队列的实现。
public class test16 {//简单阻塞队列的实现先复习一遍循环队列private int[] elem;public int front;//队头public int rear;//队尾public test16(int k) {//创建这个对象就有循环队列k大小数组elemnew int[k];}//判满入队的前提条件,入队是满就直接返回。或者你在满的时候扩容入之前判断是否满如果满扩容再入public boolean isfull(){//怎么判队尾1 回到头。但是刚好队头在原点就会产生位置相同但是队尾1的值不等于0.if((rear1)%elem.lengthfront){return true;}return false;}//判空出队的前提条件出队是空直接返回public boolean isnull(){//对头队就是空if(rearfront){return true;}
return false;}//入队方法;
public boolean offer1(int i) {if(isfull()){//满的情况返回入队失败return false;}//怎么入是入在后面还是前面呢队列尾入这时候浪费的那个空间直接赋值进去队尾往后移就好了elem[rear]i;//会不会有点不合适万一前面是没有元素呢rear(rear1)%elem.length; //这个队尾两种情况第一种是单纯的加1未到数组最后位置//比如我把前面空间删除。刚好到最后一个位置就得回归原点。%elem.length//这里分开写效果会更好rear; if(rearelem.length){ rear0; }//相比之下rear;readread%elem.length 。这个不易读不直观每次得理解好一会 。效率上又没有优势return true;}//出队方法public Int poll1(){//头出、怎么出呢。感觉不合理出队应该返回这个元素.所以得先记录if(isnull()){return -1;}int valuefront;front(front1)%elem.length;//往后移一位elem.length避免逛了一圈return elem[value];}//获取队首public int peek1(){if(isnull()){return -1;}return elem[front];}//获取队尾public int Rear(){if(isnull()){return -1;}//得注意不能直接返回read-1.因为如果read是原点那么减1不就变成负一if(rear0){return elem[elem.length-1];}elsereturn elem[rear-1];}public static void main(String[] args) {}
}
我们在此基础上加上阻塞功能就好了也就是在多线程环境下使用得保证线程安全。 在线程里使用这些方法时如果出现符合阻塞条件情况就阻塞。
public class test17 {static int i;public static void main(String[] args) throws InterruptedException {//看看能不能基于我们创建这个阻塞队列实现生产者消费者模型my blockingDequenew my(100);//这里浪费一个空间达到98就会阻塞Thread t1new Thread(()-{//生产者while (true){try {blockingDeque.offer1(i);System.out.println(i);//生产的元素i;Thread.sleep(50);//生产的很慢消费者就得阻塞先等到元素生产出来} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();Thread t2new Thread(()-{//消费者while (true){try {System.out.println(blockingDeque.poll1());//消费的元素} catch (InterruptedException e) {throw new RuntimeException(e);}}});// t2.start();}}class my {//简单阻塞队列的实现先复习一遍循环队列private int[] elem;public int front;//队头public int rear;//队尾public my(int k) {elem new int[k];}public void offer1(int i) throws InterruptedException {synchronized (this) {if (isfull()) {this.wait();}elem[rear] i;rear (rear 1) % elem.length;// 这个 notify 唤醒 poll1 中的 waitthis.notify();}}//出队方法public int poll1() throws InterruptedException {synchronized (this) {if (isnull()) {this.wait();//两个wait是不可能同时触发的因为一个队列不可能既是空又是满。只要this是同一个对象就不会.}int value front;front (front 1) % elem.length;// 这个 notify 唤醒 offer1 中的 waitthis.notify();return elem[value];}}public boolean isfull() {if ((rear 1) % elem.length front) {return true;}return false;}public boolean isnull() {//队头队尾就是空if (rear front) {return true;}return false;}}上述代码还有一丝丝的瑕疵offer1中wait被唤醒的时候if的条件一定就不成立也就是队列一定是不满的 我们当前代码是取元素的时候就唤醒是不存在这个问题。万一其它操作也可能唤醒这个wait但是情况又是队列不满的呢 所以我们改成
whlie (isnull()) {this.wait();}
- 上一篇: 微信公众号网站自己做导航条个人网站建设服务
- 下一篇: 微信公众号怎么建网站如果做网站接口
相关文章
-
微信公众号网站自己做导航条个人网站建设服务
微信公众号网站自己做导航条个人网站建设服务
- 技术栈
- 2026年04月20日
-
微信公众号开发网站开发世界足球排名前100
微信公众号开发网站开发世界足球排名前100
- 技术栈
- 2026年04月20日
-
微信公众号开发网站建设沈阳哪个男科医院好
微信公众号开发网站建设沈阳哪个男科医院好
- 技术栈
- 2026年04月20日
-
微信公众号怎么建网站如果做网站接口
微信公众号怎么建网站如果做网站接口
- 技术栈
- 2026年04月20日
-
微信公众号做网站龙岩市天宫山风景区
微信公众号做网站龙岩市天宫山风景区
- 技术栈
- 2026年04月20日
-
微信官方网站是什么做网站卖
微信官方网站是什么做网站卖
- 技术栈
- 2026年04月20日
