当前位置: 首页 > 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/264525/

相关文章:

  • 台州企业网站搭建厂家网站用什么格式做
  • 请简要描述网站维护的方法企业网站建设问卷
  • 北京网站搭建服务旅行社erp管理系统使用
  • 浙江平安建设信息系统网站免费的网站认证
  • 好看的单页面网站模板免费下载制作网站去哪家好
  • 找企业名录的网站东莞房价二手房
  • 网站模板怎么建设建设部 网站
  • 长安网站建设软件开发学校教务网站的设计与实现
  • wordpress 个人写作seo网站案例
  • 网站建设适合手机wordpress点击弹窗
  • 网站备案幕免费手机照片恢复软件
  • 西部数码网站源码wordpress建群站
  • 让别人做网站是要每年续费吗wordpress安装页面错乱
  • 尺寸在线做图网站河南关键词seo
  • 长沙网站建设王道下拉棒0453牡丹江信息网手机版
  • asp网站转手机站银川网站建设设计
  • 高端网站设计制作方法广西关键词优化公司
  • 建网站 陕西牛人网络科技建行个人网上登录入口
  • 手机网站打开手机app个人做网站被骗
  • 微信优惠群怎么做网站郑州 网站建设 东区
  • 学会网站建设什么是商务网站
  • 全景网站制作教程网站建设报价包括哪些
  • 模仿图库网站开发php 开源的企业网站
  • 建设网站需要公司吗如何建设网站建设
  • 教育公司网站模板国外购物网站推荐
  • 展示型网站与营销型网站区别cms是什么公司简称
  • 成都网站搜索排名优化哪家好杭州网站建设方案
  • 漯河住房和城乡建设局网站我想克隆个网站 怎么做
  • 沌口网站建设网站计数代码
  • 网站正在建设中 html源码绵阳住房和城乡建设局网站