集合框架 Queue---BlockingQueue详解

转载自  集合框架 Queue---BlockingQueue详解

 

  • 摘要:本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。      本例再次实现前面介绍的篮子程序,不过这个篮子中最多能
  • 本例介绍一个特殊的队列:BlockingQueue,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。
           本例再次实现前面介绍的篮子程序,不过这个篮子中最多能放得苹果数不是1,可以随意指定。当篮子满时,生产者进入等待状态,当篮子空时,消费者等待。
           BlockingQueue定义的常用方法如下:
                    add(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出异常。
                    offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false。
                    put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里有空间再继续。
                    poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null。
                    take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。
           BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类:
                    ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。
                    LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。
                    PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。
                    SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。
           LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。

import java.util.concurrent.ArrayBlockingQueue; 
import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
/** *//** 
* BlockingQueue是一种特殊的Queue,若BlockingQueue是空的, 
* 从BlockingQueue取东西的操作将会被阻断进入等待状态直到BlocingkQueue进了新货才会被唤醒。 
* 同样,如果BlockingQueue是满的任何试图往里存东西的操作也会被阻断进入等待状态, 
* 直到BlockingQueue里有新的空间才会被唤醒继续操作。 
* BlockingQueue提供的方法主要有: 
* add(anObject): 把anObject加到BlockingQueue里,如果BlockingQueue可以容纳返回true,否则抛出IllegalStateException异常。 
* offer(anObject):把anObject加到BlockingQueue里,如果BlockingQueue可以容纳返回true,否则返回false。 
* put(anObject):把anObject加到BlockingQueue里,如果BlockingQueue没有空间,调用此方法的线程被阻断直到BlockingQueue里有新的空间再继续。 
* poll(time):取出BlockingQueue里排在首位的对象,若不能立即取出可等time参数规定的时间。取不到时返回null。 
* take():取出BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。 
* 
* 根据不同的需要BlockingQueue有4种具体实现: 
* (1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。 
* (2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制, 
* 若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO(先入先出)顺序排序的。 
* LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样, 
* 导致LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue。 
* (3)PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。 
* (4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。 
* 
* 下面是用BlockingQueue来实现Producer和Consumer的例子 
*/ 
public class BlockingQueueTest { 
/** *//** 
* 定义装苹果的篮子 
*/ 
public static class Basket{ 
// 篮子,能够容纳3个苹果 
BlockingQueue basket = new ArrayBlockingQueue (3); 
// 生产苹果,放入篮子 
public void produce() throws InterruptedException{ 
// put方法放入一个苹果,若basket满了,等到basket有位置 
basket.put("An apple"); 
} 
// 消费苹果,从篮子中取走 
public String consume() throws InterruptedException{ 
// get方法取出一个苹果,若basket为空,等到basket有苹果为止 
return basket.take(); 
} 
} 
// 测试方法 
public static void testBasket() { 
// 建立一个装苹果的篮子 
final Basket basket = new Basket(); 
// 定义苹果生产者 
class Producer implements Runnable { 
public void run() { 
try { 
while (true) { 
// 生产苹果 
System.out.println("生产者准备生产苹果:" 
+ System.currentTimeMillis()); 
basket.produce(); 
System.out.println("生产者生产苹果完毕:" 
+ System.currentTimeMillis()); 
// 休眠300ms 
Thread.sleep(300); 
} 
} catch (InterruptedException ex) { 
} 
} 
} 
// 定义苹果消费者 
class Consumer implements Runnable { 
public void run() { 
try { 
while (true) { 
// 消费苹果 
System.out.println("消费者准备消费苹果:" 
+ System.currentTimeMillis()); 
basket.consume(); 
System.out.println("消费者消费苹果完毕:" 
+ System.currentTimeMillis()); 
// 休眠1000ms 
Thread.sleep(1000); 
} 
} catch (InterruptedException ex) { 
} 
} 
} 
ExecutorService service = Executors.newCachedThreadPool(); 
Producer producer = new Producer(); 
Consumer consumer = new Consumer(); 
service.submit(producer); 
service.submit(consumer); 
// 程序运行5s后,所有任务停止 
try { 
Thread.sleep(5000); 
} catch (InterruptedException e) { 
} 
service.shutdownNow(); 
} 
public static void main(String[] args) { 
BlockingQueueTest.testBasket(); 
} 
} 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cursor 过滤 android,Android cursor query方法详解

1.cursor query 方法入参public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)第一个参数,uri,rui是什么呢?好吧,上面我们提到了Android提供内容的叫Provider&a…

java实现动态验证码源代码——jsp页面

我们通常在其他网站注册或者登陆的时候会发现一个很高大上的验证码&#xff0c;那么怎么用java代码实现呢&#xff1f;下面我给大家贴一下我写的方法&#xff1a; 此文章是写的前台jsp页面的代码&#xff1a; <% page language"java" import"java.util.*&quo…

集成Swagger(API)---SpringBoot

集成Swagger(API) 学习目标: 了解Swagger的概念及作用掌握在项目中集成Swagger自动生成API文档Swagger简介 前后端分离 前端 -> 前端控制层、视图层后端 -> 后端控制层、服务层、数据访问层前后端通过API进行交互前后端相对独立且松耦合产生的问题 前后端集成,前端或者…

win10硬盘修复工具使用教程

DiskGenius 下载地址https://www.diskgenius.cn/download.php https://baijiahao.baidu.com/s?id1651410139210648102&wfrspider&forpc win10硬盘修复工具使用教程 小白一键重装系统 发布时间&#xff1a;19-11-2810:17惠州市早点科技官方帐号&#xff0c;优质创作者…

.NET Core Tools转向使用MSBuild项目格式

微软之前为了让.NET Core和ASP.NET Core能够支持Windows Visual Studio之外的开发平台&#xff0c;创建了基于project.json格式的项目系统。不过可惜&#xff0c;这种格式与之前的.csproj/MSBuild无法兼容。来自微软的Rich Lander近期宣布&#xff0c;.NET Core Tools将在最新的…

java多线程之:SynchronousQueue队列

转载自 java多线程之&#xff1a;SynchronousQueue队列 SynchronousQueue是这样一种阻塞队列&#xff0c;其中每个 put 必须等待一个 take&#xff0c;反之亦然。同步队列没有任何内部容量&#xff0c;甚至连一个队列的容量都没有。 不能在同步队列上进行 peek&#xff…

android:background大小,小Demo小知识-android:foreground与android:background

-----------------------------------------------前言君--------------------------------------------------正好碰到了这个foreground属性平时没怎么用到过。这次用到&#xff0c;就特意的去看了下。在这里记录一下。------------------------------------------------正文君…

java实现动态验证码源代码——绘制验证码的jsp

接着上一篇的前台jsp页面&#xff0c;我们单独写一个绘制验证码的jsp页面&#xff1a; <% page contentType"image/jpeg"import"java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"pageEncoding"utf-8"%> <%!Color getRandColo…

异步任务---SpringBoot

异步任务 同步 1、创建一个service包 2、创建一个类AsyncService 异步处理还是非常常用的&#xff0c;比如我们在网站上发送邮件&#xff0c;后台会去发送邮件&#xff0c;此时前台会造成响应不动&#xff0c;直到邮件发送完毕&#xff0c;响应才会成功&#xff0c;所以我们…

idea报错:Error:java: JDK isn‘t specified for module ‘xxx‘

idea报错&#xff1a;Error:java: JDK isn‘t specified for module ‘xxx‘ Code_LiYi 2020-07-01 11:54:34 274 收藏 分类专栏&#xff1a; 学海漂游 版权 错误&#xff1a;idea报错Error:java:JDK isn’t specified for module “XXXX” 原因&#xff1a;项目中的.idea文…

微软推出《我的世界》“编程一小时”免费教程,携手Code.org普及计算机科学教育

为了继续支持全球计算机科学教育周期间的“编程一小时”年度全球活动&#xff08;12月5日至11日&#xff09;&#xff0c;微软和Code.org共同发布了针对学生和教育工作者的《我的世界》造物主版编程教程。网页版全新教程现已免费上线&#xff0c;初学者可以通过教程中简单的游戏…

集合框架 Queue---ArrayBlockingQueue

转载自 集合框架 Queue---ArrayBlockingQueue 摘要&#xff1a;java.util.concurrent类java.util.concurrent 类 ArrayBlockingQueue<E> java.lang.Object java.util.AbstractCollection<E> java.util.AbstractQueue<E> java.util.…

android 处理http状态码,OkHttp(Retrofit)对于http状态码202的处理

http code 202 :The request has been accepted for processing, but the processing has not been completed.这时候&#xff0c;服务器给你的body是空的&#xff0c;如果你使用去解析为json&#xff0c;那么&#xff0c;恭喜你java.io.EOFException: End of input at line 1 …

java实现动态验证码源代码——接受ajax的jsp

此篇主要介绍的是接受前台ajax的数据&#xff0c;判断输入的验证码是否正确&#xff1a; <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%//从session里面获取图片验证码String inputCode request.getParameter…

邮件发送---SpringBoot

邮件任务 邮件发送&#xff0c;在我们的日常开发中&#xff0c;也非常的多&#xff0c;Springboot也帮我们做了支持 邮件发送需要引入spring-boot-start-mailSpringBoot 自动配置MailSenderAutoConfiguration定义MailProperties内容&#xff0c;配置在application.yml中自动装…

2.Idea分支的merge

1.选择需要merge到的版本 比如说develop是主板本。temp是紧急分支版本的话。 name要选到develop这个版本进行操作。 2.进行merge 1.选择“merge changes” image.png 2.选择对应的要merge的版本 image.png 3.记得PUSH代码 0人点赞 IDEA git使用 作者&#xff1a;了凡_850…

在Linux上编译dotnet cli的源代码生成.NET Core SDK的安装包

.NET 的开源&#xff0c;有了更多的DIY乐趣。这篇博文记录一下在新安装的 Linux Ubuntu 14.04 上通过自己动手编译 dotnet cli 的源代码生成 .net core sdk 的 deb 安装包。 1&#xff09;安装一个现有版本的 .net core sdk sudo sh -c echo "deb [archamd64] https://apt…

android菱形imageview,ios – 在UICollectionView中,UIImageView应该是圆形视图而不是菱形...

我有UICollectionView和UIImageView(如图所示).我想把它作为圆形视图.但是,当我运行应用程序时,它显示为菱形(下图).在(UICollectionViewCell *)collectionView&#xff1a;(UICollectionView *)collectionView中cellForItemAtIndexPath&#xff1a;(NSIndexPath *)indexPath {…

Java多线程-BlockingQueue-ArrayBlockingQueue-LinkedBlockingQueue

转载自 Java多线程-BlockingQueue-ArrayBlockingQueue-LinkedBlockingQueue 前言&#xff1a; BlockingQueue很好的解决了多线程中&#xff0c;如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类&#xff0c;为我们快速搭建高质量的多线程程序带来极大的便利…

定时任务---SpringBoot

定时任务 项目开发中经常需要执行一些定时任务&#xff0c;比如需要在每天凌晨的时候&#xff0c;分析一次前一天的日志信息&#xff0c;Spring为我们提供了异步执行任务调度的方式&#xff0c;提供了两个接口。 TaskExecutor接口 任务执行TaskScheduler接口 任务调度 两个注…