【阻塞队列BlockingQueue非阻塞队列ConcurrentLinkedQueue同步队列SyncQueue】

news/2025/1/15 15:25:53/

文章目录

    • 阻塞队列BlockingQueue
    • 非阻塞队列ConcurrentLinkedQueue
    • 同步队列SyncQueue
    • 小故事

阻塞队列BlockingQueue

阻塞队列是一种数据结构,它具有线程安全性,可以用于多线程环境中的生产者消费者模式,其中生产者将消息插入队列,消费者将消息从队列中删除并处理。

它是一个抽象接口,提供了几个方法如 put() 和 take(),这些方法在队列为空或队列已满时会阻塞线程,直到队列中有足够的空间或足够的元素可供获取。

BlockingQueue 接口有多种实现,例如 ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue 等。

下面是一个使用 ArrayBlockingQueue 的示例:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ProducerConsumerPattern {public static void main(String[] args) throws InterruptedException {BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);Thread producerThread = new Thread(() -> {for (int i = 1; i <= 50; i++) {try {queue.put(i);} catch (InterruptedException e) {e.printStackTrace();}}});Thread consumerThread = new Thread(() -> {for (int i = 1; i <= 50; i++) {try {int data = queue.take();System.out.println("Consumed: " + data);} catch (InterruptedException e) {e.printStackTrace();}}});producerThread.start();consumerThread.start();producerThread.join();consumerThread.join();}
}

非阻塞队列ConcurrentLinkedQueue

非阻塞队列是一种线程安全的队列,它支持高并发的读写操作。ConcurrentLinkedQueue 是一种常见的非阻塞队列,它基于链表实现。

ConcurrentLinkedQueue 不会像 BlockingQueue 一样在队列满或队列为空时阻塞线程,取而代之的是它使用了一些特殊的算法来处理并发操作,因此能够支持高并发。

下面是一个使用 ConcurrentLinkedQueue 的示例:

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;public class ProducerConsumerPattern {public static void main(String[] args) throws InterruptedException {Queue<Integer> queue = new ConcurrentLinkedQueue<>();Thread producerThread = new Thread(() -> {for (int i = 1; i <= 50; i++) {queue.offer(i);}});Thread consumerThread = new Thread(() -> {for (int i = 1; i <= 50; i++) {int data = queue.poll();System.out.println("Consumed: " + data);}});producerThread.start();consumerThread.start();producerThread.join();consumerThread.join();}
}

同步队列SyncQueue

同步队列是一种特殊的队列,它可以用于线程间的手递手操作,其中每个线程都必须等待其他线程完成它们的操作,然后才能继续执行。

Java 中的 SynchronousQueue 就是一种同步队列,它可以实现生产者消费者模式。当一个线程试图向队列中添加元素时,它会被阻塞,直到另一个线程从队列中取走元素。同样,当一个线程尝试从队列中获取元素时,它会被阻塞,直到另一个线程向队列中添加元素。

下面是一个使用 SynchronousQueue 的示例:

import java.util.concurrent.SynchronousQueue;public class ProducerConsumerPattern {public static void main(String[] args) throws InterruptedException {SynchronousQueue<Integer> queue = new SynchronousQueue<>();Thread producerThread = new Thread(() -> {for (int i = 1; i <= 50; i++) {try {queue.put(i);} catch (InterruptedException e) {e.printStackTrace();}}});Thread consumerThread = new Thread(() -> {for (int i = 1; i <= 50; i++) {try {int data = queue.take();System.out.println("Consumed: " + data);} catch (InterruptedException e) {e.printStackTrace();}}});producerThread.start();consumerThread.start();producerThread.join();consumerThread.join();}
}

小故事

阻塞队列BlockingQueue的小故事:

有个工厂生产零部件,每一个零部件都需要经过两个工人的加工才能完成。第一个工人在生产零部件的时候将其放入一个装满零部件的待处理队列中,第二个工人从待处理队列中拿出零部件加工并放到另一个已完成队列中。为了保证生产线的稳定运作,待处理队列和已完成队列的长度必须有限制。如果待处理队列满了,第一个工人就不能再往里面放零部件了,必须等待第二个工人从队列中取出零部件。这就是阻塞队列的工作原理,当队列满了或者空了,生产者和消费者线程会被阻塞等待,直到队列中有可用的元素或者有空位。

非阻塞队列ConcurrentLinkedQueue的小故事:

有个商店在进行促销活动,每隔一段时间就会发布一个优惠券,顾客可以领取这个优惠券,但是每个顾客只能领取一次。商店把每个领取过优惠券的顾客名字放进了一个队列中,可以使用ConcurrentLinkedQueue作为这个队列的数据结构。当一个顾客想领取优惠券时,它会先检查自己是否已经领取过,如果没有,则将自己的名字放进队列中。这时候,其他想领取优惠券的顾客也会在队列中插入他们的名字,但是由于队列使用了无锁的CAS(Compare and Swap)操作实现并发访问,所以他们之间不会产生争用而导致线程阻塞。

同步队列SyncQueue的小故事:

有个小区住户需要把垃圾袋放到小区的垃圾桶中。小区设置了一个运输车队,每个运输车都可以装载一定数量的垃圾袋。当一个住户需要丢垃圾时,他会把垃圾袋放到自己居住楼层的垃圾桶旁边,然后按下一个按钮,运输车就会来收集这些垃圾袋。当运输车到达住户居住楼层时,它会把垃圾袋从垃圾桶中取出并装进自己的运输车中,当运输车装满时,它就会离开小区去倾倒垃圾。这就是同步队列的工作原理,每个住户都可以把自己的垃圾袋放到队列中,但是只有运输车到达时,才能从队列中取出垃圾袋进行处理。这个过程需要同步管理,以确保不会有两个车同时去同一个地方或者一个车去了两次同一个地方。


http://www.ppmy.cn/news/378387.html

相关文章

小程序图片截取

总结微信小程序图片截取 1. 将图片进行合理的等比缩放显示&#xff0c;使之能很好的显示在屏幕上。 2.采用画布,ctx.drawImage&#xff08;根据缩放的图片,设置绘制图片大小&#xff09; ctx.draw绘制在画布上。 3.在ctx.draw的回调中调用微信小程序wx.canvasToTempFilePath导…

【云原生 | 54】Docker三剑客之Docker Compose应用案例二:大数据Spark集群

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

第三方网站无法引用微信图片

解决此图片来自微信公众平台未经允许不可引用问题&#xff0c;第三方网站无法引用微信图片 在html上加下面这句话就可以 //html <meta name"referrer" content"never">原理&#xff1a;HTTP Referrer是header的一部分&#xff0c;当浏览器向web服务…

SpringBoot上传图片到本地并在线预览

SpringBoot上传图片到本地并实现URL预览 0.预期效果 项目上传的图片保存到本地磁盘上&#xff0c;返回给前端一个地址&#xff0c;前端根据该地址可以在浏览器上访问查看该图片&#xff08;感觉和上传到服务器上没啥区别&#xff09; 1.创建项目 创建个SpringBoot项目&…

海边小岛

第二天&#xff0c;开车去大海里的一个岛屿之上&#xff0c;体会这岛屿与陆地不一样的感觉.午餐又是吃海鲜&#xff0c;青色的贝壳&#xff0c;花哈&#xff0c;螃蟹&#xff0c;皮皮虾等等&#xff0c;想起之前公司去黄山的时候吃的竹笋&#xff0c;野味&#xff0c;山里的野菜…

奶爸日记4 - 海边看轮船玩滑梯

1、看轮船 今天周末&#xff0c;一早起来&#xff0c;娃娃就跟我说&#xff0c;叫爸爸带她出去玩&#xff0c;她要去玩滑梯看轮船&#xff0c;中午我们在楼下快餐店吃完饭&#xff08;普通的江苏菜&#xff09;&#xff0c;有鱼有肉有茄子有西蓝花有白菜有豆腐有萝卜汤。之后哄…

html图标动态移动效果图,html5特效-鼠标悬浮在图片上以及移动时的动画

这是一款鼠标悬浮在图片上以及鼠标在图片上移动时的动画,总共有8个特效,完整源码下载: http://pan.baidu.com/s/1pLLH3M7 密码: kvp5 效果预览 鼠标悬浮动画 部分js代码: (function() {var tiltSettings = [ {}, {movement: {imgWrapper : {translation : {x: 10, y: 10, z…

这几款图片格式转换器帮助你轻松解决图片转换难题

最近夏天又到了&#xff0c;相信很多小伙伴都想去海边吹吹海风、踩踩沙滩了吧&#xff1f;我已经去过了并且带上了相机&#xff0c;拍了很多好看的照片&#xff0c;但大部分相机输出的格式都是raw格式的&#xff0c;有时我们想对图片进行编辑就不太方便&#xff0c;因此&#x…