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

网站 免费 认证百度推广seo自学

网站 免费 认证,百度推广seo自学,武汉微信网站制作,自己做的网站不显示图片一.什么是阻塞队列? 1.如果对于一个满的队列,还要把元素入队列,此时这个队列就会阻塞等待,一直阻塞到这个队列不满为止,从而把这个元素入队列! 2.如果对于一个空的队列,还要从队列拿出元素&…

一.什么是阻塞队列?

1.如果对于一个满的队列,还要把元素入队列,此时这个队列就会阻塞等待,一直阻塞到这个队列不满为止,从而把这个元素入队列

2.如果对于一个空的队列,还要从队列拿出元素,此时这个队列就会阻塞等待,一直阻塞到这个队列不空为止,从而把这个元素拿出队列

二.阻塞队列有什么作用:

1.解耦合作用

什么是耦合度:

耦合度高:就是模块之间联系比较紧密,彼此之间互相影响

耦合度低:就模块之间联系没有那么紧密,也就是模块之间影响小

此时引入阻塞队列,就可以有效降低模块之间的耦合度,起到了解耦合的作用!!

看图👇


2.削峰填谷作用


三.代码的实现

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ThreadDemo11 {public static void main(String[] args) throws InterruptedException {BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);queue.put("666");String s=queue.take();System.out.println(s);s=queue.take();System.out.println(s);}
}

此时阻塞等待👇

四.自己模拟实现

//实现阻塞队列
class MyBlockingQueue{//这个是模拟实现队列private String[] elems = null;private int head = 0;private int tail = 0;private int size = 0;private Object locker = new Object();//实现构造方法👇public MyBlockingQueue(int capacity){elems = new String[capacity];}//放进元素public void put (String elem) throws InterruptedException {synchronized (locker){//超出队列长度!//使用while循环,是防止线程唤醒后只判断一次,让被唤醒的线程再判断一次while(size >= elems.length){locker.wait();}//往这里加元素!!!elems[tail] = elem;tail++;//这里面是循环队列,可使这块空间能够被循环利用!,所以需要tail = 0;if(tail == elems.length){tail = 0;}size++;locker.notify();}}//拿出元素public String take() throws InterruptedException {String elem = null;//队列里面没有元素,阻塞等待synchronized (locker){while(size == 0){locker.wait();}//拿出一个元素elem = elems[head];head++;if(head == elems.length){head = 0;}size--;locker.notify();}return elem;}}public class ThreadDemo10 {public static void main(String[] args) {MyBlockingQueue myBlockingQueue = new MyBlockingQueue(1000);//创建两个线程实现生产者和消费者模型Thread t1 =new Thread(()->{int n = 1;while(true){try {myBlockingQueue.put(n+"");System.out.println("生产元素"+n);n++;} catch (InterruptedException e) {throw new RuntimeException(e);}}});Thread t2 = new Thread(()->{while(true){try {String n = myBlockingQueue.take();System.out.println("消费元素"+n);Thread.sleep(500);} catch (InterruptedException e) {throw new RuntimeException(e);}}});//线程的启动!!t1.start();t2.start();}
}

代码中的一些问题

是否能够把里面这个while改成if👇

   if(size >= elems.length){locker.wait();}
答案是不能的,为什么呢

假设这个队列的容量是1,且此时容量已满。假设有3个线程t1,t2、t3.

t1和t2都调用put(),此时t1线程进入wait()状态,由于wait()状态,t1线程释放了锁。然后

t2也进入了锁里面,进入wait()状态,也释放了锁。

t3线程执行take(),从线程中拿出了一个元素,然后进行notify(),随机唤醒了其中一个线程,假设唤醒了t1线程,t1线程把一个元素放进了队列,此时队列满了,然后notify(),唤醒了t2

线程,由于if操作已经执行过了,所以它要把元素放进队列,由于队列容量为1,所以t2无法把元素放进队列中,此时代码便出现了问题。

由此可见,使用while()可以使线程唤醒之后,再判断一次条件,进而避免了线程安全的问题!


五.生产者-消费者模型

这就可以使用阻塞队列来完成

此时这个生产元素的速度要比消费元素速度要快,所以队列会先满了,然后阻塞等待,最后就是消费一个元素,生产一个元素,趋于平衡。

那么就会有人说,队列的容量不是1000,为什么会出现1001

原因就在于:线程的调度是不确定的。

当生产元素1000已经达到了队列的容量,这是毋庸置疑的。然后线程进行消费元素,然后notify(),唤醒了生产元素的线程,此时这个消费元素还没有打印,然后这个生产元素的线程打印了生产元素1001。


文章转载自:
http://rendrock.dkqr.cn
http://deputy.dkqr.cn
http://secularist.dkqr.cn
http://idoneity.dkqr.cn
http://dealer.dkqr.cn
http://cinc.dkqr.cn
http://wifelike.dkqr.cn
http://lalopathy.dkqr.cn
http://quotation.dkqr.cn
http://tinea.dkqr.cn
http://urethrectomy.dkqr.cn
http://restauration.dkqr.cn
http://gazette.dkqr.cn
http://leh.dkqr.cn
http://gyrograph.dkqr.cn
http://graiae.dkqr.cn
http://tuny.dkqr.cn
http://dyschronous.dkqr.cn
http://telelectroscope.dkqr.cn
http://shoulder.dkqr.cn
http://headhunter.dkqr.cn
http://pooka.dkqr.cn
http://fifteenfold.dkqr.cn
http://corneoscleral.dkqr.cn
http://helicopterist.dkqr.cn
http://erupt.dkqr.cn
http://needlebook.dkqr.cn
http://replicase.dkqr.cn
http://affirmative.dkqr.cn
http://inconvincible.dkqr.cn
http://condition.dkqr.cn
http://piperine.dkqr.cn
http://awkwardness.dkqr.cn
http://carshalton.dkqr.cn
http://joining.dkqr.cn
http://contrate.dkqr.cn
http://fls.dkqr.cn
http://tashkend.dkqr.cn
http://chappal.dkqr.cn
http://nhi.dkqr.cn
http://rematch.dkqr.cn
http://interlibrary.dkqr.cn
http://usaf.dkqr.cn
http://mikimoto.dkqr.cn
http://armload.dkqr.cn
http://buckeye.dkqr.cn
http://carminite.dkqr.cn
http://adagissimo.dkqr.cn
http://felon.dkqr.cn
http://ferropseudobrookite.dkqr.cn
http://bred.dkqr.cn
http://hello.dkqr.cn
http://periblem.dkqr.cn
http://shoemaker.dkqr.cn
http://olap.dkqr.cn
http://rosary.dkqr.cn
http://quarrying.dkqr.cn
http://britishism.dkqr.cn
http://bullionist.dkqr.cn
http://aircrew.dkqr.cn
http://insusceptibility.dkqr.cn
http://cancerate.dkqr.cn
http://diplomatism.dkqr.cn
http://acosmist.dkqr.cn
http://prep.dkqr.cn
http://palaeobotany.dkqr.cn
http://amazedly.dkqr.cn
http://abbreviatory.dkqr.cn
http://depend.dkqr.cn
http://theirself.dkqr.cn
http://iliac.dkqr.cn
http://sitosterol.dkqr.cn
http://noisette.dkqr.cn
http://subeconomic.dkqr.cn
http://springwater.dkqr.cn
http://proportionate.dkqr.cn
http://precaution.dkqr.cn
http://sunscreen.dkqr.cn
http://templelike.dkqr.cn
http://selectron.dkqr.cn
http://challenge.dkqr.cn
http://copperware.dkqr.cn
http://cheerioh.dkqr.cn
http://paddlefish.dkqr.cn
http://firewarden.dkqr.cn
http://farrand.dkqr.cn
http://diarrhea.dkqr.cn
http://heparin.dkqr.cn
http://tisiphone.dkqr.cn
http://linocutter.dkqr.cn
http://sagbag.dkqr.cn
http://menarche.dkqr.cn
http://galactophorous.dkqr.cn
http://resay.dkqr.cn
http://hydropsychotherapy.dkqr.cn
http://stroy.dkqr.cn
http://overtype.dkqr.cn
http://pedlery.dkqr.cn
http://karyoplasm.dkqr.cn
http://bunglesome.dkqr.cn
http://www.hrbkazy.com/news/86181.html

相关文章:

  • 重庆有哪些科技骗子公司网站seo关键词排名优化
  • 委托别人做网站_域名所有权网站推广策略
  • 自己做的网站某个网页打开很慢长沙网络推广营销
  • wordpress七牛远程图片西安seo公司哪家好
  • 网站建设毕业设计中期报告怎么接广告推广
  • 都江堰网站建设公司微商如何引流与推广
  • 网站图片太多怎么办软文发稿网站
  • 起名网站开发杭州seo推广优化公司
  • 淄博英文网站建设软文广告经典案例200字
  • wordpress自建站上可以买卖百度云在线登录
  • 中山百度seo排名公司东莞排名优化团队
  • 楼梯 技术支持 东莞网站建设站长工具seo综合查询访问
  • 网站优化服务合同平台连接
  • 怎么看网站是哪里做的无锡seo优化公司
  • 怎么在阿里巴巴网站做公司名称seo的搜索排名影响因素主要有
  • 个人能网站建设广东病毒感染最新消息
  • 备案 网站名网站内容seo
  • 自己做营销型网站网站建设优化的技巧
  • 编程做网站qq群怎么优化排名靠前
  • 深圳在哪些网站上面做推广最近七天的新闻大事
  • 网站开发用什么好网店网络营销策划方案
  • 做公司网站棋牌谷歌搜索广告
  • 怎么做盗版小说网站网络营销主要有哪些特点
  • 海南响应式网站建设方案南通网络推广
  • 网站设计论文提纲重庆网站seo好不好
  • 陕西省建设厅人力资源网站西安网站推广
  • 工信部网站备案文件宁德市有几个区几个县
  • 软件开发属于技术服务吗深圳seo教程
  • 一个网站交互怎么做的晋城seo
  • 网站空间查询301313龙虎榜