从J2SE 5.0开始有了java.util.concurrent套件,其中的类可以使实现多线程相关功能更为方便。本节将简介concurrent套件中的几个简单常用的类。
15.3.1 BlockingQueue
队列(Queue)是一个先进先出(First In First Out, FIFO)的数据结构。在J2SE 5.0中增加了java.util.concurrent.BlockingQueue。在多线程情况下,如果BlockingQueue的内容为空,而有个线程试图从Queue中取出元素,则该线程会被Block,直到Queue有元素时才解除Block;反过来,如果 BlockingQueue满了,而有个线程试图再把数据填入Queue中,则该线程会被Block,直到Queue中有元素被取走后解除Block。
BlockingQueue的几个主要操作如表15-1所示。
表15-1 BlockingQueue的几个操作
java.util.concurrent中提供几种不同的BlockingQueue。ArrayBlockingQueue要指定容量大小来构建。LinkedBlockingQueue默认没有容量上限,但也可以指定容量上限。PriorityBlockingQueue严格来说不是Queue,因为它是根据优先权(Priority)来移除元素。
我们以在wait()、notify()介绍时的生产者、消费者程序为例,使用BlockQueue来加以改写,优点是不用亲自处理wait()、notify()的细节。首先生产者改写如范例15.21所示:
范例15.21 ProducerQueue.java
package onlyfun.caterpillar;
import java.util.concurrent.BlockingQueue;
public class ProducerQueue implements Runnable {
private BlockingQueue<Integer> queue;
public ProducerQueue(BlockingQueue<Integer> queue) {
this.queue = queue;
}
public void run() {
for(int product = 1; product <= 10; product++) {
try {
// wait for a random time
Thread.sleep((int) Math.random() * 3000);
queue.put(product);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
|
可以看到,直接使用BlockingQueue,会自动处理同步化、wait()和notify()的执行。消费者类改写如范例15.22所示:
范例15.22 ConsumerQueue.java
package onlyfun.caterpillar;
import java.util.concurrent.BlockingQueue;
public class ConsumerQueue implements Runnable {
private BlockingQueue<Integer> queue;
public ConsumerQueue(BlockingQueue<Integer> queue) {
this.queue = queue;
}
public void run() {
for(int i = 1; i <= 10; i++) {
try {
// wait for a random time
Thread.sleep((int) (Math.random() * 3000));
queue.take();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
|
可以使用范例15.23进行简单的测试:
范例15.23 BlockingQueueDemo.java
package onlyfun.caterpillar;
import java.util.concurrent.BlockingQueue;
public class ConsumerQueue implements Runnable {
private BlockingQueue<Integer> queue;
public ConsumerQueue(BlockingQueue<Integer> queue) {
this.queue = queue;
}
public void run() {
for(int i = 1; i <= 10; i++) {
try {
// 等待一个随机时间
Thread.sleep((int) (Math.random() * 3000));
queue.take();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
|
由于BlockingQueue不需要您来控制,所以没有特意显示信息以表示生产者、消费者放入产品至Queue的信息,不过仍可以在ProducerQueue与ConsumerQueue中放入相关信息显示,以确认程序确实在运转。
分享到:
相关推荐
Node.js v4,Node.js v6,Odoo 8,OpenERP 6.1,OpenERP 7.0,Piwik,Podcast Generator,PrestaShop,PrestaShop1.7,Ruby,Spree,SugarCRM,Tomcat6,Webalizer,osCommerce,phpBB 等已经下架群辉套件下载地址。
诺基亚 PC 套件诺基亚 PC 套件诺基亚 PC 套件诺基亚 PC 套件诺基亚 PC 套件诺基亚 PC 套件
换机套件2是换机套件的补充版,主要内容为:装机手顺,tomcat压缩包
ZigBee开发套件内容.zip
诺基亚PC套件,诺基亚,PC,套件诺基亚PC套件,诺基亚,PC,套件
诺基亚PC套件清除器-官方版诺基亚PC套件清除器-官方版诺基亚PC套件清除器-官方版
这个里面包含了群晖第三方套件源,都是我手机整理来的,最近测试过后,将不能用的一下都删了,现在留下了17个套件源,可以让你的群晖服务器干更多的事情。
Weblogic套件Weblogic套件Weblogic套件Weblogic套件Weblogic套件Weblogic套件Weblogic套件Weblogic套件
DSM6.X套件.zip
php服务器安装套件,支持windows环境下php系统快速安装运行。套件包含了mysql,phpmyadmin以及主流的php版本,从php5.2.17至php7.0多个版本可自由选择切换版本。布置php运行环境从此变得轻松自由。
浪潮GS管理软件套件是一款专业的GS企业管理软件,专为大中型集团企业开发,可以有效帮助企业实现财务集中管理、资金集中管理、资产集中管理以及供应链集中管理,从而实现集团企业成员之间的协同办公以及资源共享。...
电子 45款传感器套件
单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件单片机 c51软件 学习套件
DSM7.X套件.zip
putty套件.zip
我们已经创建了QuickStart套件,帮助开发商把握这一巨大的市场机遇。该入门级套件简单易用,适合蓝牙低耗能技术初级开发人员使用,可帮助加快开发进程,最终节省宝贵的时间和资源。 套件内容 蓝牙低耗能基本概念 1. ...
戴尔硬盘保护增强套件V4.0181106
nokia e71 pc ovi 套件,连接手机与电脑
该工具适用于安全渗透测试人员,可以用来检测弱加密算法套件,
开发套件内容 C8051F0XX开发套件包括下列各项 C8051F0XX 目标板 串行适配器(RS-232 至目标系统协议转换器) Cygnal IDE 与产品信息光盘 光盘内容包括 Cygnal 集成开发环境(IDE) Keil 软件 8051 开发工具 宏汇编...