Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java并发编程工具类JUC之二:ArrayBlockingQueue队列

java并发编程工具类JUC之二:ArrayBlockingQueue队列

作者头像
字母哥博客
发布于 2021-03-27 09:41:39
发布于 2021-03-27 09:41:39
43700
代码可运行
举报
运行总次数:0
代码可运行

ArrayBlockingQueueBlockingQueue接口的实现类,它是有界的阻塞队列,内部使用数组存储队列元素。这里的“有界”是指存储容量存在上限,不能无限存储元素。在同一时间内存储容量存在着一个上限值,这个上限制在初始实例化的时候指定,之后便不能修改了。

ArrayBlockingQueue内部采用FIFO (First In, First Out)先进先出的方法实现队列数据的存取,队首的元素是在队列中保存时间最长的元素对象,队尾的元素是在队列中保存时间最短的元素对象。

下面的代码说明如何初始化一个ArrayBlockingQueue,并向其中添加一个对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BlockingQueue queue = new ArrayBlockingQueue(1024);
queue.put("1");   //向队列中添加元素
Object object = queue.take();   //从队列中取出元素

BlockingQueue可以通过泛型来限定队列中存储数据的类型,下面的代码以String为泛型,表示该队列只能存储String类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
queue.put("1");
String string = queue.take();

实现一个生产消费的实例

在前面的文章中我们曾经讲过:BlockingQueue经常被用于生产消费的缓冲队列。下面我们就使用ArrayBlockingQueue来真正的实现一个生产消费的例子。

BlockingQueueExample开启两个独立线程,一个是Producer生产者线程,负责向队列中添加数据;另一个是Consumer消费者线程,负责从队列中取出数据进行处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BlockingQueueExample {

    public static void main(String[] args) throws Exception {
        //使用ArrayBlockingQueue初始化一个BlockingQueue,指定容量的上限为1024
        BlockingQueue queue = new ArrayBlockingQueue(1024);

        Producer producer = new Producer(queue);  //生产者
        Consumer consumer = new Consumer(queue);  //消费者

        new Thread(producer).start();  //开启生产者线程
        new Thread(consumer).start();  //开启消费者线程

        Thread.sleep(4000);
    }
}

Producer为生产者,每隔10秒钟使用put()方法向队列中放入一个对象,放入三次。在这10秒的间隔内,队列数据被消费者取走之后将导致消费者线程阻塞。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Producer implements Runnable{

    protected BlockingQueue queue = null;

    public Producer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            queue.put("1");
            Thread.sleep(10000);
            queue.put("2");
            Thread.sleep(10000);
            queue.put("3");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

下面的代码是消费者类Consumer,它从队列中获取待处理的元素对象,并调用System.out将其打印出来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Consumer implements Runnable{

    protected BlockingQueue queue = null;

    public Consumer(BlockingQueue queue) {
        this.queue = queue;
    }

    public void run() {
        try {
            System.out.println(queue.take());
            System.out.println(queue.take());
            System.out.println(queue.take());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上面的代码打印结果是每隔10秒打印一次,因为其中take()方法在队列内没有元素可以取到的时候,会阻塞当前的消费者线程,让其处于等待状态,这个方法我们在上一节介绍BlockingQueue的时候就已经进行过说明。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mac shell(fish) javac 中文乱码
通过用户的环境变量(~/.bash_profile)去改.写入文件.bash_profile  vim ~/.bash_profile
obaby
2023/02/23
5530
theos iosopendev各种蛋疼的问题
1.xcrun: error: unable to find utility “codesign_allocate”, not a developer tool or in PATH
obaby
2023/02/23
4560
让Mac OS终端支持高亮显示
编辑用户当前目录下的.bash_profile文件即可,如果没有可以创建一个。在文件中输入如下的内容,保存之后重启即可。
obaby
2023/02/24
1.7K0
Charles V4.6.1 序列号
Charles其实是一款代理服务器,通过成为电脑或者浏览器的代理,然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的,能够在Windows,Mac,Linux上使用。开发iOS都在Mac系统上吧,安装Charles的时候要先装好Java环境。这么好的软件不是免费的,官网要好几十刀呢,我这里有一个Mac上的破解版,点击这里下载,当然不是最新版的。如果你想体验最新版,Charles是提供试用的。
obaby
2023/02/22
9100
iPhone5 QQ音乐文件导出
不过随便去目录下搜索了下还是能找到文件在什么地方的,什么tm0,tm3之类的文件,全部下载下来就行了。
obaby
2023/02/23
5500
iOS https(SSL/TLS)数据捕获
要捕获iPhone上的appstore的数据还真的没那么容易,以前介绍的那些使用代理手工导入证书的方法已经完全失效了,结果就是安装证书之后再打开appstore也无法正常的建立连接。按照我的分析其实是appstore在检测证书无效之后直接就没有发起任何的请求(可以通过wireshark抓包查看网络数据) 随之而来的是第二种方法,patch ssl证书校验函数,根据这个原理实现的有两个工具,一个是ssl kill switch,另外一个是trustme。原理都是一样的,并且也非常的简单,按照作者的说法是truestme实现的更底层一些。但是很不幸的是,结局是同样的悲哀的,在iOS6之后这个东西也是失效了。 其实我这里要说的方法也比较简单,如果阅读过上面两个工具的源代码(请自行搜索相关代码),并且理解mac os/iOS 下https实现的相关原理,那么也就自然的想到hook发送和接收函数的方法来捕获数据了。 需要关心的函数只有两个sslread和sslwrite: 代码:
obaby
2023/02/23
5460
海信(Hisense)60E3F 安装第三方应用
老家的房子装修完一段时间了,最近准备家电。于是就想着把现在用的电视替换下来,带回老家用。之所以有这么个决定是因为1在老家呆的时间有限,并且现在用的电视已经四五年了,系统非常卡。但是如果连接有线电视看基本没有任何问题,尺寸也足够55寸。于是就从二手东买了一个新的进来,做完安装好之后,想给电视装个ds file。结果拷贝到u盘之后发现文件不显示。无法安装。
obaby
2023/02/22
8050
Litespeed Cache https模式下css/js 加载失败
安装litespeed插件并且开启之后,发现原有的页面样式丢失了。导致这个问题的原因在于虽然访问的是https的链接,但是资源文件依旧是http协议加载的,所以就直接挂掉了。解决这个问题最简单的办法应该是开启全站https,但是我并不想这么干,想依旧提供http访问的能力。于是找各种解决方法,网上提供的解决方案包含但不限于下面这几种:
obaby
2023/02/22
6400
Putty OpenSSH SSH-2 private key (old PEM format)
当使用putty登陆时,会提示这个错误,这是因为key的格式不兼容putty导致的,需要转换一下
obaby
2023/02/22
8860
SQLiteMaestro v11.3.0.1 Crack Guide
其实这个东西也不算是破解掉了,因为外面的那个aspr的壳没有脱掉,于是借助工具创建了一个带壳的loader。其实东西如果脱壳了,那么破解就非常简单了。如果不知道怎么脱这个壳,参考这里。如果已经脱掉壳了。那么破解也就非常简单了。这里就简单的贴几条代码,看懂了就看,看不懂就算了。为了兑现前面说的话,这里不再提供loader下载,大家去别的地方找吧。不好意思。
obaby
2023/02/24
2160
OSX app 启动后在程序坞不显示
用回mac之后发现各种神奇的问题,比如cocos运行之后在程序坞中找不到,开的窗口多了之后每次想找到他得翻半天(主要是不会各种神奇的快捷键)。
obaby
2023/02/24
6010
两道C语言题目
1:给定一个升序排列的数组,要求插入一个新数据后仍然升序输出,例如:原数据为:1,6,9,23,56,95插入新的一个数据50后输出变为:1,6,9,23,50,56,95.
obaby
2023/02/28
6240
两道C语言题目
.vimrc 配置文件
Mac OS下默认的vim配置文件也够蛋疼的,什么都没有。这个发一个,不是我自己写的 😉 ,其实本来应该是那个地方的来着我也忘了,去掉了一行不支持的配置。 最简单的办法是在用户目录下执行 wget http://www.h4ck.org.cn/.vimrc 当然也可以复制下面的代码自己创建这个文件: "========================================================================= " DesCRiption: vimrc for
obaby
2023/02/23
9500
是UPS吖(二)–-群晖
开篇当然还是最喜欢的小姐姐啊。其实ups的安装还是非常简单的,不过后面的插孔都是3插,机柜上就安装了一排机柜插座,导致出现一个问题就是机柜内很多双口插头没地方插,本来想把边上的插排撤掉的,但是明显不行啊,两个光纤转换器插头+路由器+交换机的插头都没地方插,于是就把插排又给按上了。安装之后的效果就是下面这个样子啦。
obaby
2023/02/22
7300
深入解析Xcode无证书编译以及真机调试
从标题就可以看出文章的主要内容了,一个是无证书编译,另外一个则是真机调试。网上关于此类文章很多,但是基本都是抄来抄去的,也没一个详细的说明具体这么做的原因。并且配置的步骤也基本一致,没什么太大的区别。
obaby
2023/02/23
1.9K0
Plist Editor Pro(plist文件编辑工具)V2.5[64 bit] for Windows Crack
链接:https://pan.baidu.com/s/1CrzI_9GRjquUgQy4LIL0BA 密码:1t70
obaby
2023/02/24
1.9K0
再谈Mac 终端的高亮
也不知道为什么苹果不愿意默认情况下让那个终端支持高亮,每次都要非诚蛋疼的重新配置,哈哈,其实问题的关键是我用的不是mac的主机,用的虚拟机跑的mac,现在还是挺顺畅的。今天这里要介绍的不是配置脚本,是另外的一个终端工具,fish。嘎嘎
obaby
2023/02/23
7930
Windows git log 中文乱码
文章很多,但是没啥重点,问题的根源在于less的编码问题。所以只需要一步解决,设置 LESSCHARSET=utf-8 环境变量。
obaby
2023/02/24
7350
批处理 激活virtualenv 并且运行Python 命令
* 网站名称:obaby@mars * 网址:https://h4ck.org.cn/ * 本文标题: 《批处理 激活virtualenv 并且运行Python 命令》 * 本文链接:https://h4ck.org.cn/2019/01/%e6%89%b9%e5%a4%84%e7%90%86-%e6%bf%80%e6%b4%bbvirtualenv-%e5%b9%b6%e4%b8%94%e8%bf%90%e8%a1%8cpython-%e5%91%bd%e4%bb%a4/ * 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。
obaby
2023/02/24
8430
Mac m1 安装Wine/WineHQ
在m1上安装尝试了比较多的教程,基本都失败了。直到看到这篇文章:https://git.boc-group.eu/adoxxosports/adoxx-15-64bit/-/blob/master/Installation%20Manual%20(M1)%20Wine%20und%20Azure%20SQL
obaby
2023/02/22
8.1K0
相关推荐
Mac shell(fish) javac 中文乱码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验