资兴市网站建设专业,网站建设采取招标的方式,wordpress多级菜单,简洁网站设计欣赏阿华代码#xff0c;不是逆风#xff0c;就是我疯#xff0c;你们的点赞收藏是我前进最大的动力#xff01;#xff01;希望本文内容能够帮助到你#xff01;
目录 一#xff1a;阻塞队列
1#xff1a;概念
2#xff1a;阻塞队列与普通队列比较
二#xff1a;“生…阿华代码不是逆风就是我疯你们的点赞收藏是我前进最大的动力希望本文内容能够帮助到你
目录 一阻塞队列
1概念
2阻塞队列与普通队列比较
二“生产者消费者模型”——包饺子
1包饺子流程
2分工协作
1解释
2问题
三“生产者消费者模型”——分布式系统
1分布式模型
2队列阻塞优化
3缺点
4优点
①解耦合
②缓冲压力削峰填谷
四自己实现一个阻塞队列
前引库中自带阻塞队列的数据结构
编辑
1自己实现的一个队列
2线程安全问题
1问题一
2阻塞队列部分怎么写
①用wait
②唤醒问题
③解决方法 一阻塞队列
1概念
对于一个满的队列入队操作就会陷入阻塞直到这个队列有元素出队后才可以往队列里面加入元素。
对于一个空的队列出队操作就会陷入阻塞直到这个队列有元素入队后才可以对队列进行出队操作
2阻塞队列与普通队列比较
阻塞队列在多线程中是比价安全的
二“生产者消费者模型”——包饺子
1包饺子流程
①和面一般一个人即可不适用于多线程
②撵饺子皮
③包饺子
上述②③可以多线程进行
假设现在有三个滑稽老铁包饺子 假设每个滑稽老铁拿到擀面杖擀了一个皮包了一个饺子在这个过程中滑稽老铁会争夺擀面杖锁竞争虽然比单线程快但是效率还是很低
2分工协作 1解释
上述图一号老铁负责专门撵饺子皮生产2,3号负责包饺子桌子阻塞队列负责传递饺子皮大大提高了包饺子的效率。
2问题
①1号滑稽撵饺子皮的速度远远大于包饺子的速度导致桌子上全是饺子皮此时桌子就相当于队列阻塞
②1号滑稽撵饺子皮的速度远远小于包饺子的速度导致桌子上是空的2号3号空闲此时桌子就相当于队列空
三“生产者消费者模型”——分布式系统
1分布式模型
通过上面的简述我们来看实际开发中是怎样的模型 实际开发过程中服务器的整个功能往往是由多个服务器分工它们彼此间通过网络通信进行交互。
2队列阻塞优化
但在上述图中A与BA与C之间的耦合性比较强有一个挂了很可能就会影响到其它的服务器于是我们引入队列阻塞 A和BCD之间不是直接交互了而是通过队列这个中间桥梁进行交互如果B挂了也不会影响到ACD
3缺点
①系统更复杂了要维护的服务器变多
②效率降低有阻塞队列这个中间商必然会增加开销了
4优点
①解耦合
②缓冲压力削峰填谷 四自己实现一个阻塞队列 前引库中自带阻塞队列的数据结构 在Java标准库中提供了三种现成的带有阻塞队列的数据结构 其中它们的入队列有两种方法put自带阻塞效果offer不带有阻塞效果 下面我们举例一种 ArrayBlockingQueue queue2 new ArrayBlockingQueue(100);try {queue2.put(put方法不带阻塞功能);} catch (InterruptedException e) {throw new RuntimeException(e);}queue2.offer(offer方法带有阻塞功能);try {System.out.println(queue2.take());System.out.println(queue2.take());} catch (InterruptedException e) {throw new RuntimeException(e);} 1自己实现的一个队列
package thread;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-09-25* Time: 17:47*/
class MyQueue{String[] elems null;int head 0;//记录出元素时int tail 0;//记录进元素时int size 0;//当前队列中有多少个元素public MyQueue(int capacity){elems new String[capacity];}public void put(String elem){if (size elems.length ){//此时队列满了放不了要在这写阻塞return;}elems[tail] elem;tail;if(tail elems.length){tail 0;}size;}public String take(){if(size 0){return null;}String elem elems[head];head;if (head elems.length){head 0;}size--;return elem;}}
public class ThreadDemon31 {public static void main(String[] args) {MyQueue queue new MyQueue(100);queue.put(aaa);queue.put(bbb);queue.put(ccc);queue.put(ddd);System.out.println(开始出队列);System.out.println(queue.take());System.out.println(queue.take());System.out.println(queue.take());System.out.println(queue.take());}
}2线程安全问题 1问题一
①打包成这样可以吗——不行size最后会被写两遍
②解决方式给整个put方法内部都加上synchronized 2阻塞队列部分怎么写
①用wait ②唤醒问题 可以看到上述图例假设现在队列满两个put都阻塞take出了 一个元素唤醒了第一个put第一个put又唤醒了第二个put这就出问题了
③解决方法
详细看明白上面举的例子后继续~~
我们知道对于wait等待和notify唤醒中间隔着的几秒对于计算机来说可能就会发生翻天覆地的变化。这个if条件句就是被唤醒后其实现状不一定像一开始满足这个if条件句了 于是我们引入替换成——while语句句内的wait被唤醒后会再一次进行条件判断如果此时条件不满足会再一次的陷入wait等待。
在java编译器中也是推荐wait和while循环配套使用。