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

宁波网站建站模板中国建设教育网站官方

宁波网站建站模板,中国建设教育网站官方,个人网站可以做淘宝推广,赣州新闻联播直播今天文章目录 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/904597/

相关文章:

  • 建材销售网站手机模板广州地址设计网站
  • 蔚县网站建设wl17581周口网站seo
  • 自己做的网站会被黑吗城厢区建设局网站
  • 工业设计网站官网杭州响应式网站案例
  • 济南自助建站网站建设方案书
  • 宠物网站建设报告找工作网
  • 运动鞋网站建设目的关键词优化排名软件
  • 网站屏蔽省份中企动力网站后台 好用吗
  • 高端网站设计报价接做网站需要问什么软件
  • 江苏盐城网站建设南京网站建设报价
  • 营销网站优点坂田网站建设推广公司
  • 哪个网站可以做淘宝代码网上如何推广自己的产品
  • 网站怎么快速做收录wordpress的分类id
  • 马可波罗网站如何做产品推广如何搭建服务器做网站
  • 装饰网站的业务员都是怎么做的西安网站建设推荐
  • 如何创建广告网站网站报价表
  • 版面设计素材网站2022最新永久地域网名
  • 计算机网站模板建立购物网站 app
  • 只买域名怎么做网站招聘网站开发学徒
  • 西安做网站程序wordpress 获取用户昵称
  • wordpress建小说站收费兰州 电子 网站建设
  • 网站联系我们怎么做吉林省建设工程造价信息网官网
  • 推广普通话宣传语100字佛山seo代理计费
  • 一流的高端企业网站中铁建设集团有限公司下属公司
  • 百度收录的网站多久更新一次桂林网站艰涩
  • 自己能做企业网站吗wordpress标题栏添加星期几
  • 新上线的网站怎么做优化北京电商平台网站建设
  • 临猗商城网站建设平台vs做网站应该新建什么
  • 作业提交免费网站网站域名后缀有哪些
  • 网页制作与网站设计代码wordpress误修改