当前位置: 首页 > news >正文

网站标签怎么设置wordpress能用一个数据库

网站标签怎么设置,wordpress能用一个数据库,北京燕化工程建设有限公司网站,工程材料信息价查询网免费目录 一、阻塞队列 1.阻塞队列概述 2.生产者消费者模型 3.阻塞队列的作用 4.标准库中的阻塞队列类 5.例子#xff1a;简单生产者消费者模型 二、阻塞队列模拟实现 1.实现循环队列#xff08;可跳过#xff09; 1.1简述环形队列 1.2代码实现 2.实现阻塞队列 2.1实… 目录 一、阻塞队列 1.阻塞队列概述 2.生产者消费者模型 3.阻塞队列的作用 4.标准库中的阻塞队列类 5.例子简单生产者消费者模型 二、阻塞队列模拟实现 1.实现循环队列可跳过 1.1简述环形队列 1.2代码实现 2.实现阻塞队列 2.1实现思路 2.2代码实现 2.3代码解析 ①wait和notify的使用实现自动阻塞和解阻塞 ②while循环判断线程安全的铜墙铁壁 2.4纯享版代码实现无注释 一、阻塞队列 1.阻塞队列概述 阻塞队列是一种特殊的队列同样遵循“先进先出”的原则支持入队操作和出队操作。在此基础上阻塞队列会在队列已满或队列为空时陷入阻塞使其成为一个线程安全的数据结构它具有如下特性 当队列已满时继续入队列就会阻塞直到有其他线程从队列中取走元素。当队列为空时继续出队列也会阻塞直到有其他线程向队列中插入元素。 2.生产者消费者模型 生产者消费者模型有两种角色生产者和消费者两者之间通过缓冲容器来达到解耦合的效果。类似于厂商和客户与中转仓库之间的关系如下图 厂家生产的商品堆积在中转仓库当中转仓库满时入仓阻塞当中转仓库为空时出仓阻塞。通过上述结构生产者和消费者摆脱了“产销一体”的运作模式即解耦合。同时无论是客户需求暴增还是厂家产量飙升都会被中央仓库协调避免突发情况导致结构崩溃。 同理根据生产者消费者模型我们将线程带入到消费者和生产者的角色阻塞队列带入到缓冲空间的角色一个类似的模型很容易就搭建起来了。 所以说阻塞队列对生产者消费者模型是相当重要的。 3.阻塞队列的作用 ①解耦合 作为生产者消费者模式的缓冲空间将线程其他之间分隔通过阻塞队列间接联系起来起到降低耦合性的作用这样即使其中一个挂掉也不会使另一个也跟着挂掉。 ②削峰填谷 因为阻塞队列本身的大小是有限的所以能起到一个限制作用即在消费者面对突发暴增的入队操作依然不受影响。 如电商平台在每年双十一时都会出现请求峰值的情况如下杜撰 而假设电商平台对请求的处理流程是这样的 因为处理请求需要消耗硬件资源如果没有消息队列面对双十一这种请求暴增的情况请求处理服务器很可能就直接挂掉了。 而有了消息队列之后请求处理服务器不必直接面对大量请求的冲击仍旧可以按原先的处理速度来处理请求避免了被冲爆这就是‘削峰’。 没有被处理的请求也不是不处理了而是当消息队列有空闲时再继续流程即高峰请求被填在低谷中这就是‘填谷’。 经过‘削峰填谷’之后的请求处理曲线就(大致)变成了下图 4.标准库中的阻塞队列类 类名说明LinkedBlockingQueue基于链表的阻塞队列常用LinkedBlockingDeque基于链表的双端阻塞队列LinkedTransferQueue基于链表的无界阻塞队列ArrayBlockingQueue基于顺序表的阻塞队列PriorityBlockingQueue带有优先级功能的阻塞队列 方法    解释void put(E e)带有阻塞特性的入队操作方法常用E take() 带有阻塞特性的出队操作方法常用boolean offer(E e, long timeout, TimeUnit unit) 带有阻塞特性的入队操作方法并且可以设置最长等待时间E poll(long timeout, TimeUnit unit) 带有阻塞特性的出队操作方法并且可以设置最长等待时间public boolean contains(Object o)  判断阻塞队列中是否包含某个元素 5.例子简单生产者消费者模型 可调整生产时间和消费时间观察效果。 //模拟实现的阻塞队列 class MyBlockingQueue {private Object lock new Object();private String[] elems null;private int head 0;private int tail 0;private int size 0;public MyBlockingQueue(int capacity) {elems new String[capacity];}public void put(String elem) throws InterruptedException {synchronized(lock) {while(size elems.length) {lock.wait();}elems[tail] elem;tail;if(tail elems.length) {tail 0;}size;lock.notify();}}public String tack() throws InterruptedException {String elem null;synchronized (lock) {while(size 0) {lock.wait();}elem elems[head];head;if(head elems.length) {head 0;}size--;lock.notify();}return elem;} }public class ThreadDemo1 {public static void main(String[] args) throws InterruptedException {MyBlockingQueue queue new MyBlockingQueue(10);//生产者线程Thread producerModel new Thread(() - {int number 0;while(true) {try {queue.put( number);System.out.println(生产了 number);Thread.sleep(400);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//消费者线程AThread consumerModelA new Thread(() - {String number;while(true) {try {number queue.tack();System.out.println(A消费了 number);Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//消费者线程BThread consumerModelB new Thread(() - {String number;while(true) {try {number queue.tack();System.out.println(B消费了 number);Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});producerModel.start();consumerModelA.start();consumerModelB.start();} } 二、阻塞队列模拟实现 1.实现循环队列可跳过 在正式实现阻塞队列之前我们需要先将普通循环队列这个框架搭建起来再考虑为其加入阻塞队列的特性。 1.1简述环形队列 环形队列也被称为循环队列是一种特殊的线性数据结构。它的操作基于先进先出FIFO的原则并且队尾被连接在队首之后以形成一个循环可以使用数组或链表实现这里采用数组。 环形队列在逻辑上是环形的但在物理上它通常是通过一个定长的数组来实现的。环形队列的大小是确定的一旦创建它所能存放的元素个数就是固定的。先进先出队列队首出队队尾入队 1.2代码实现 class AnnularQueue {//String类型的数组存储队列元素private String[] elems null;//队首位置private int head 0;//队尾位置private int tail 0;//存储的元素个数private int size 0;//构造方法用于构建定长数组数组长度由参数指定public AnnularQueue(int capacity) {elems new String[capacity];}//入队方法public void put(String elem) throws InterruptedException {//当队列已满时拒绝入队if(size elems.length) {return;}//将元素存入队尾elems[tail] elem;//存入后队尾位置后移一位tail;//实现环形队列的关键超过数组长度后回归数组首位if(tail elems.length) {//回归数组首位tail 0;}//存入后元素总数加一size;}//出队方法public String tack() throws InterruptedException {String elem null;//当队列为空时拒绝入队返回nullif(size 0) {return elem;}//出队取出队首值不用置空队尾存入时覆盖elem elems[head];//出队后队首位置后移一位head;//实现环形队列的关键超过数组长度后回归数组首位if(head elems.length) {//回归数组首位head 0;}//存入后元素总数加一size--;//返回取出的元素return elem;} } 2.实现阻塞队列 2.1实现思路 前面说到了“阻塞队列是一种特殊的队列同样遵循‘先进先出’的原则支持入队操作和出队操作”实现一个只有入队和出队操作的队列很简单关键在于如何将阻塞队列的特性加入进去使其能够判断队列是否已满或是为空进而阻塞等待。 判断是否未满很简单只要在队列中定义一个size变量统计已存个数当已存个数和队列长度相同时就为已满size为0时队列为空。 阻塞等待也不难只要引入锁在入队、出队操作中使用wait和notify就可以了。 真正的难点在于阻塞队列是适配于多线程程序的必须要考虑到线程安全问题而这一问题往往不好解决。 来先看一下基于环形队列的简单阻塞队列到底是如何实现的吧。 2.2代码实现 测试可使用上文的例子‘简单生产者消费者模型’。 class MyBlockingQueue {//对象公用锁private Object lock new Object();//String类型的数组存储队列元素private String[] elems null;//队首位置private int head 0;//队尾位置private int tail 0;//存储的元素个数private int size 0;//构造方法用于构建定长数组数组长度由参数指定public MyBlockingQueue(int capacity) {elems new String[capacity];}//入队方法public void put(String elem) throws InterruptedException {synchronized(lock) {//已满时入队操作阻塞while(size elems.length) {lock.wait();}//将元素存入队尾elems[tail] elem;//存入后队尾位置后移一位tail;//实现环形队列的关键超过数组长度后回归数组首位if(tail elems.length) {//回归数组首位tail 0;}//存入后元素总数加一size;//当出队操作阻塞时入队后为其解除阻塞//入队后队列不为空了lock.notify();}}//出队方法public String tack() throws InterruptedException {//存储取出的元素默认为nullString elem null;synchronized (lock) {//队列为空时出队操作阻塞while (size 0) {lock.wait();}//出队取出队首值不用置空队尾存入时覆盖elem elems[head];//出队后队首位置后移一位head;//实现环形队列的关键超过数组长度后回归数组首位if(head elems.length) {//回归数组首位head 0;}//存入后元素总数加一size--;//当入队操作阻塞时出队后为其解除阻塞//出队后队列不满lock.notify();}//返回取出的元素return elem;} } 2.3代码解析 ①wait和notify的使用实现自动阻塞和解阻塞 首先看wait的位置 判断条件很易懂就是当队列已满为空时调用wait方法使调用该方法的线程陷入阻塞也就是说线程阻塞时队列是一定陷入已满或为空状态的。 那么什么时候解除阻塞呢当然是失去已满或为空状态的时候。 调用tack方法出队能够使队列留出位置不再已满调用put方法入队能够为队列存入元素不再为空两者相辅相成。 所以阻塞的put方法一定是要在别的线程调用tack方法完成出队后才可能解除阻塞的阻塞的tack方法也一定是要在别的线程调用put方法完成入队后才可能解除阻塞的。 注意“可能”二字因为阻塞的可能有很多线程所以还要再参与lock锁竞争。 ②while循环判断线程安全的铜墙铁壁 代码中while循环条件为判断队列状态是否已满为空若判断通过则线程阻塞等待状态解除。就直观效果而言使用if语句和while循环的区别不大但对于多线程程序我们不得不多考虑一些。 在实现自动阻塞和解阻塞时我们让put方法入队操作和tack方法出队操作互相为对方解除阻塞。 但是put方法和stack方法中用的是同一把锁lock并且notify方法的机制是随机解除一个线程的阻塞那么不管是put方法入队操作还是tack方法出队操作调用notify方法都可能反而为“同类”解除了阻塞而我们的原意是要让他们互相解除阻塞。 下图示例就是一种bug可能在队列容量为100当前元素量为99的情况下由于notify的随机唤醒机制已满状态下的队列又进行了一次入队操作。出队bug同理 而使用while循环则不会出现这样的bug由于wait方法在循环体内部因此当阻塞结束后仍然会再次判断队列状态即便再次堵塞后又出现同样的问题也没关系大不了继续判断至死方休。 ③其他问题请留言 2.4纯享版代码实现无注释 class MyBlockingQueue {private static Object lock new Object();private String[] elems null;private int head 0;private int tail 0;private int size 0;public MyBlockingQueue(int capacity) {elems new String[capacity];}public void put(String elem) throws InterruptedException {synchronized(lock) {while(size elems.length) {lock.wait();}elems[tail] elem;tail;if(tail elems.length) {tail 0;}size;lock.notify();}}public String tack() throws InterruptedException {String elem null;synchronized (lock) {while(size 0) {lock.wait();}elem elems[head];head;if(head elems.length) {head 0;}size--;lock.notify();}return elem;} } 博主是Java新人每位同志的支持都会给博主莫大的动力欢迎留言讨论如果有任何疑问或者发现了任何错误都欢迎大家在评论区交流“ψ(∇´)ψ
http://www.zqtcl.cn/news/160870/

相关文章:

  • 网站编辑专题怎么做徐州建筑工程招投标网站
  • 英文网站建设合同招考网站开发
  • 网上商城网站 找什么做dede本地环境搭建网站
  • 网站开发遇到的问题及解决方法深圳市做网站有哪些公司
  • 自媒体网站 程序18款免费软件app下载推荐
  • 产业园门户网站建设方案瑞昌网络推广
  • 长春市网站建设动漫wordpress主题下载地址
  • 如何做专业的模板下载网站wordpress 多网址
  • 做qq头像的网站wordpress 安装 服务器 系统
  • 怎样查网站的注册地点百度小说排行榜2021
  • 网站建设中中文模板wordpress siren
  • 设计本官方网站电脑版附近室内装修公司电话
  • 服务外包网站wordpress 禁止转载
  • l礼品文化网站建设不常见的网络营销方式
  • 做网站侵权腾讯企点打不开
  • iis 网站拒绝显示此网页上海网站建设类岗位
  • 营销型网站建设推荐google关键词
  • 网站上线是前端还是后端来做如何做垂直门户网站
  • 网站建设与管理2018海尔集团网站 建设目的
  • ps做网站大小wordpress调用 php文件
  • php网站忘记后台密码江苏网页制作报价
  • 网站模板 哪个好完备的常州网站推广
  • 衡水淘宝的网站建设濮阳市城乡一体化示范区主任
  • 公司网上注册在哪个网站商洛市商南县城乡建设局网站
  • 怎么才能让网站图文展示大连网站建设设计
  • 俱乐部网站 模板seo产品是什么意思
  • 新手学做网站的教学书建造师查询官网
  • win2012 iis添加网站群辉做网站服务器
  • 网站优化课程培训山东网站备案公司
  • top wang域名做网站好事业单位门户网站建设评价