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

网站怎么做转发wordpress图片素材主题

网站怎么做转发,wordpress图片素材主题,做网站用哪个服务器不用备案,做流量网站怎么做找往期文章包括但不限于本期文章中不懂的知识点#xff1a; 个人主页#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏#xff1a;JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势#xff1a;生产者—消费者模型的劣势#xff1a; Java标准库中的阻… 找往期文章包括但不限于本期文章中不懂的知识点 个人主页我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势生产者—消费者模型的劣势 Java标准库中的阻塞队列模拟实现阻塞队列 前面我们学习多线程的经典案例之一饿汉模式与懒汉模式。两者的区别是创建类的实例的时机不同前者是迫不及待的去创建类的实例而后者是迫不得已去创建类的实例。这样就导致了前者在 get 方法中只有读操作不会造成线程安全问题而后者会出现线程安全问题。最后经过我们的不断深入探索并解决了其中的问题。首先是进行加锁操作避免了修改操作原子性其次是加了 if 判断语句避免了不必要的加锁从而导致的性能下降最后针对指令重排序的问题在引用变量中加上了 volatile 关键字。如果想更加深入了解可以点击下面的链接饿汉模式、懒汉模式、指令重排序等 阻塞队列 现在我们来学习另外一个经典的案例阻塞队列。 阻塞队列是属于队列的一种但是和普通的队列相比它具有以下的特性 1、它具备线程安全的特点即使在多线程的环境下也是可以正常使用的。 2、阻塞特性1当队列为空时如果再去队列中取元素的话会发生阻塞直至队列不为 空2当队列满了时如果再去队列中插入元素的话也会发生阻塞直至队列不为满。 生产者—消费者模型 阻塞队列的主要应用场景是“生产者—消费者模型”。那什么是生产者什么又是消费者呢简单理解就是生产者与消费者之间是通过某种资源进行来进行交互的。生产者就是生产这个资源的而消费者就是消耗这个资源的。 例如在我们日常中最常见的就是包饺子包饺子需要擀面皮的人、包饺子的人、放面皮的布。(肉已经被绞肉机给搞好了) 这里就是一个经典的生产者一消费者模型。 生产者擀面皮的人、消费者包饺子的人、阻塞队列放面皮的布。这里生产者与消费者进行交互的就是面皮这种资源。 我们在日常生活中有两种包饺子的方式 1、家里面几个人全部一起参与包饺子的全过程。即每个人都需要 擀面皮、包饺子。而擀面杖只有一个那么当一个人在进行擀面皮时另外几个人都得阻塞等待当这个人把面皮给擀完之后才会释放这样下一个人才有机会去使用。这个擀面杖就是我们前面学习的锁。 上面的方式我们会发现一个很大的缺陷当其中一个人在生产面皮时其余的人得阻塞等待也就是有空闲时间。这对于计算机来说简直就是浪费因此下面这种方式更为合理。 2、一个人专门擀面皮另外的人负责包饺子这样就不会导致生产者或者消费者会出现空闲的情况生产速度与消费速度是一致的。 生产者—消费者模型的优势 1、解耦合 生产者与消费者避免了直接交互而是通过阻塞队列来进行交互这样有利于代码的解耦合使得后期的维护成本变低。 2、削峰填谷 当 生产者—消费者模型 应用于两个服务器时就可以达到削峰填谷的效果。 因此为了避免上述的情况我们需要对用一个阻塞队列来处理这种突然的大量请求的情况。例如学校选课的时候通常就会出现这样的情况。 解决方法使用一个阻塞队列来充当缓冲的作用。当A服务器突然接收到有大量的请求时这个阻塞队列便会接收这些请求但是还是以平常的速度给到B服务器这样B服务器还是会正常运行这就是 “削峰”。当这个峰值过去之后就是平常少量的请求而阻塞队列这时候就会来处理在高峰期接收的请求这样B服务器还是以平常的速度在处理请求这就是填谷。阻塞队列通过降低高峰期的发送请求而是在低谷期来处理这样B服务器就是以一个平均的速度在处理请求。 注意 1、阻塞队列通常可以接收并存放很多的请求。 2、高峰期比较短所以阻塞队列一般不会出现满的情况。 生产者—消费者模型的劣势 1、引入阻塞队列之后整体的结构相交以前更为复杂了同时也需要更多的机器进行部署使生产环境的结构更复杂同时管理起来也更为麻烦了。 2、效率也有一定的影响。之前是A服务器和B服务器直接进行交互现在多了个阻塞队列消息的传递所消耗的时间也变多了。 Java标准库中的阻塞队列 Java的标准库中提供的阻塞队列是BlockingQueue。 我们在日常的开发中主要就是使用ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue。下面是使用的示例 public class Test {public static void main(String[] args) throws InterruptedException {BlockingQueueInteger queue new LinkedBlockingQueue(100);// 在多线程中队列的插入方法要用put。因为其带有阻塞功能且线程安全queue.put(1);queue.put(2);queue.put(3);queue.put(4);// 同样多线程中的删除也要用takeint n queue.size();for (int i 0; i n; i) {System.out.print(queue.take() ); // 1 2 3 4}} }我们现在可以去看一下阻塞功能。 public class Test {public static void main(String[] args) throws InterruptedException {BlockingQueueInteger queue new LinkedBlockingQueue(1);// 在队列为空的情况下尝试去取元素System.out.println(queue.take()); // 由于是单线程因此会一直阻塞即死等。queue.put(1);// 在队列为满足尝试去插入新元素queue.put(2);} } 同样下面去尝试插入新元素时也是会发生阻塞等待的也是死等的情况。 public class Test {public static void main(String[] args) {int n 1;System.out.println(队列的总容量n);BlockingQueueInteger queue new LinkedBlockingQueue(n);System.out.println(队列此时的容量queue.size());Thread t1 new Thread(()- {try {System.out.println(阻塞队列为空尝试取出元素等待其他的线程插入元素);queue.take();System.out.println(成功取出元素~);} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread t2 new Thread(()-{try {for (int i 0; i 3; i) {Thread.sleep(1000); // 确保t1线程先执行到take方法并放慢让我们观察System.out.println(正在尝试插入第 (i 1) 个元素);queue.put(i);System.out.println(插入成功~);}} catch (InterruptedException e) {throw new RuntimeException(e);}});t1.start();t2.start();} } 运行结果 模拟实现阻塞队列 要求我们主要是实现队列的 put方法、take方法、size方法即可。 思路put、take方法都需要保证线程安全和阻塞的特性。 线程安全我们直接对代码进行加锁操作即可 阻塞特性当队列为满时要阻塞到其他线程使用掉其中的对头元素即得等待其他线程调用take方法来唤醒当前因队列满而造成的阻塞这也就需要用到我们前面学习的wait 和 notify 方法。 阻塞队列代码 public class MyBlockingQueue {// 基于数组去模拟实现private static int[] array null;private static int usedSize 0; // 元素个数private int head 0; // 头指针private int tail 0; // 尾指针public MyBlockingQueue() {array new int[10];}public MyBlockingQueue(int capacity) {if (capacity 0) {throw new RuntimeException();} else if (capacity Integer.MAX_VALUE) {array new int[Integer.MAX_VALUE];} else {array new int[capacity];}}// put方法public void put(int x) throws InterruptedException {synchronized (this) { // 保证线程安全while (usedSize array.length) { // 满足阻塞队列的特性// 阻塞等待this.wait(); // 等待其他线程取出元素使队列不为满}array[tail] x;tail (tail1) % array.length; // 这里是采用循环队列的方式usedSize;this.notify(); // 唤醒空的阻塞}}public int take() throws InterruptedException {synchronized (this) { // 保证线程安全while (usedSize 0) { // 满足阻塞队列的特性// 阻塞等待this.wait(); // 等待其他线程插入元素使队列不为空}int ans array[head];head (head1) % array.length;usedSize--;this.notify(); // 唤醒满的阻塞return ans;}}public int size() {return usedSize;} } 测试代码 public class Test {public static void main(String[] args) throws InterruptedException {int n 1;MyBlockingQueue queue new MyBlockingQueue(n);System.out.println(队列的总容量为n);System.out.println(队列当前的容量为queue.size());Thread t1 new Thread(()-{try {Thread.sleep(500);System.out.println(队列为空阻塞等待别的线程插入数据);queue.take();System.out.println(取出元素~);} catch (InterruptedException e) {throw new RuntimeException(e);}});Thread t2 new Thread(()-{for (int i 0; i 3; i) {try {Thread.sleep(1000);System.out.println(正在尝试插入第(i1)个元素);queue.put(i);System.out.println(插入成功~);} catch (InterruptedException e) {throw new RuntimeException(e);}}});t1.start();t2.start();} } 运行结果 注意 1、我们使用加锁操作是为了避免出现下面这种情况一个线程在修改另一个线程在读取把数据修改之后可能会造成另一个线程执行有误因此我们得对代码进行加锁操作是同一时刻只能有一个线程去进行修改操作读取操作是不会影响数据的因此对于修改操作的代码都得处于 synchronized 代码块中而上述 put、take 方法的大部分代码都是修改操作因此我们就将整个代码逻辑都置于 synchronized 代码块中了。 2、put、take 方法中之所以将判断阻塞的条件放到 while 循环中是因为可能会出现下面这样的情况有三个线程都是处于put方法的阻塞状态而这时新来了一个执行take方法的线程其会随机唤醒三个线程中的一个当三个线程中某个线程执行完 notify 方法之后也会随机唤醒剩下的两个线程但是此时这个唤醒操作不符合要求因为我们是希望将处于take方法的阻塞线程所唤醒因此这个是错误唤醒所以我们要用 while 循环去再次线程判断到底是不是因为正常唤醒而被唤醒的。 好啦本期 初始JavaEE篇——多线程4生产者-消费者模型、阻塞队列 的学习之旅 就到此结束啦
http://www.zqtcl.cn/news/472430/

相关文章:

  • 互联网兼职做网站维护wordpress评论微信通知
  • 合肥瑶海区网站建设方案长沙网站 建设推广世云网络
  • wordpress 挂码seo推广公司哪家好
  • 高端 网站设计公司wordpress添加投稿功能
  • 长沙 网站设计 公司价格江苏专业网站建设费用
  • 做的好的手机网站有哪些内容手机怎么做app详细步骤
  • net网站开发参考文献c++能不能作为网页开发语言
  • 我公司让别人做网站了怎么办厦门logo设计公司
  • 闸北专业做网站怎么判断网站优化过度
  • 搭建网站seowordpress重新安装如何做
  • 网站设计优化重庆教育建设有限公司网站
  • 域名注册网站查询手工制作视频教程简单又漂亮
  • 书画院网站源码网站百度指数
  • 网页设计与网站开发第三版课后答案网络运营商是干嘛的
  • wordpress分类目录网站主题自己做营销型网站
  • 简述网站推广的五要素seo排名软件怎么做
  • 做网站能做职业吗织梦如何做几种语言的网站
  • 手机网站定制咨询如何修改网站
  • 长沙大型网站建设公司建站工作室源码
  • 找设计方案的网站专注南昌网站建设
  • UE做的比较好的网站汕头网站关键词优化教程
  • 做羞羞的事情网站广州番禺招聘网最新招聘信息
  • 网站基础开发成本网站建设策划包括哪些内容
  • 商务网站建设哪家好绍兴网站建设做网站
  • 网站域名管理东莞网页设计和网页制作
  • 网站建设与制作报价网站app制作
  • 下载可以做动漫的我的世界视频网站长沙网站seo技巧
  • 汕头网站制作推荐制作影视视频的软件
  • 定制程序网站宁波英文网站建设
  • 安康公司做网站网页设计怎么设计