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

建立网站的步骤是什么广州免费自助建站平台

建立网站的步骤是什么,广州免费自助建站平台,民政 门户网站 建设,编辑目录中的字体wordpress文章目录 1. 什么是堵塞队列?2. 堵塞队列的方法3. 生产者消费者模型4. 自己实现堵塞队列 1. 什么是堵塞队列? 堵塞队列也是队列,故遵循先进先出的原则。但堵塞队列是一种线程安全的数据结构,可以避免线程安全问题,当队…

文章目录

    • 1. 什么是堵塞队列?
    • 2. 堵塞队列的方法
    • 3. 生产者消费者模型
    • 4. 自己实现堵塞队列

1. 什么是堵塞队列?

堵塞队列也是队列,故遵循先进先出的原则。但堵塞队列是一种线程安全的数据结构,可以避免线程安全问题,当队列为空时,继续出队列会发生堵塞,直至其他线程有元素进队列。当队列满时,继续入队列会堵塞,直至其他线程有元素出队列。
生产者消费者模型就是最经典的堵塞队列模型之一。

2. 堵塞队列的方法

Java标准库里含有堵塞队列,我们使用时可以直接使用标准库即可。

  • BlockingQueue是个接口,真正实现的类是:LinkedBlockingQueue。
  • put方法入队列,take方法出队列,具有堵塞性。
  • peek,offer,poll等方法也可以使用,但是不具有堵塞性。
BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
queue.put();
queue.take();

3. 生产者消费者模型

这是一个常见的并发编程模型,用于协调生产者和消费者之间的工作,在这个模型中,一个线程负责生产元素,一个线程负责消费元素。
它也是一个堵塞队列 ,所以具有堵塞队列的特性。

public class Test {public static void main(String[] args) {BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();//t1线程负责生产元素Thread t1 = new Thread(() -> {try{Random random = new Random();while (true){int i = random.nextInt();System.out.println("生产元素: " + i);queue.put(i);Thread.sleep(1000);}}catch (InterruptedException e){e.printStackTrace();}});//t2负责消费元素Thread t2 = new Thread(() -> {try {while(true){int i = queue.take();System.out.println("消费元素: " + i);}} catch (InterruptedException e) {e.printStackTrace();}});t1.start();t2.start();}
}

运行结果:
1

4. 自己实现堵塞队列

自己实现堵塞队列需要满足:

  • 通过循环队列来实现;
  • 使用synchronized实现加锁,进行同步;
  • put 插入元素的时候, 判定如果队列满了, 就进行 wait. (注意, 要在循环中进行 wait. 被唤醒时不一定队列就不满了, 因为同时可能是唤醒了多个线程);
  • take 取出元素的时候, 判定如果队列为空, 就进行 wait. (也是循环 wait) ;
class BlockingQueue{//定义一个数组private int[] arr;//数组中元素个数private int size = 0;//记录数组头的位置private int read = 0;//记录尾的位置private int tail = 0;//锁Object lock = new Object();//构造方法,确定数组大小public BlockingQueue(int i){arr = new int[i];}//入队列public void put(int value){try{//加锁,保证线程安全synchronized (lock){//使用while,不要使用if,否则notifyAll时,所有等待线程都被唤醒,造成线程安全while(arr.length == size){lock.wait();}arr[tail] = value;//循环队列tail = (tail + 1) % arr.length;//添加一个元素,size加一次size++;//唤醒所有线程lock.notifyAll();}}catch (InterruptedException e){e.printStackTrace();}}public int take() {//返回值,不能写在try里面int value = 0;try {//上锁synchronized (lock) {//队列为0,等待,使用whilewhile (size == 0) {lock.wait();}//赋返回值value = arr[read];//循环read = (read + 1) % arr.length;//出队列一个,减一个size--;//唤醒lock.notifyAll();}} catch (InterruptedException e) {e.printStackTrace();}//返回值return value;}}
public class Test4 {public static void main(String[] args) throws InterruptedException {BlockingQueue queue = new BlockingQueue(10);Thread t1 = new Thread(() -> {try{Random random = new Random();while (true){int value = random.nextInt(100);System.out.println("生产元素: " + value);queue.put(value);Thread.sleep(100);}}catch (InterruptedException e){e.printStackTrace();}});//t2负责消费元素Thread t2 = new Thread(() -> {while(true){int value = queue.take();System.out.println("消费元素: " + value);}});t1.start();Thread.sleep(2000);t2.start();}
}

1111
1 因为t2 未启动,所以只能生产元素,当生产10个元素后,队列满了,进入堵塞,等待被唤醒;
2 因为t1生产时,每次都会休眠,线程执行非常迅速,所以队列一直出元素,直到队列为空,进入堵塞,等待被唤醒;
3生产一个元素消费一个元素。

http://www.yayakq.cn/news/638887/

相关文章:

  • 做二手车网站需要什么手续费临沂网站建设培训学校
  • 网站内链工作做足商标注册申请要多少钱
  • 最好的html5画廊显示质量html5的网站海南第六建设工程有限公司网站
  • 微信网站建站平台网络域名ip查询
  • 杭州网站建设的公司wordpress 改语言
  • 电影购票网站开发背景福建建设执业管理中心网站
  • 什么网站可以做论文安卓app大全下载
  • ai做图标教程网站优秀网页设计作品
  • 济南市建设局网站朋友圈推广平台
  • 网站推广软件app微软公司做网站的软件
  • 网站打开速度多少时间建设学校网站的报告
  • 网站内部代码优化网站排名易下拉用法
  • 哈尔滨企业网站模板建站长沙o2o网站制作公司
  • 星级酒店网站建设公司哪个网站可以免费学设计
  • 公司网站设计公司网站源码怎么用
  • 简单的景区介绍网页制作代码泉州网站建设优化
  • 百色做网站淘客网站建设收费吗
  • 网站链接锚点怎么做南头专业企业网站建设公司
  • 科技公司网站建设wordpress4.2.19 漏洞
  • ps图做ppt模板下载网站有哪些广州公司注册地址要求
  • 建设银行官方网站登录网址福建网站优化
  • 四川旅游seo整站优化怎样卸载下载的wordpress
  • 北京哪里可以申请企业网站域名官网制作3d动画的软件
  • 网站关键字个数制作公司简介
  • 微网站怎么做百度关键词h5如何做多页面网站
  • 网站开发中网页上传网站字体一般是什么字体
  • 济南手机网站建设wordpress熊掌号提交
  • 域名网站教程生活服务网站开发
  • 可以发布外链的网站泰安有口碑的网站建设
  • diy学做衣服网站结构优化设计