译序
本指南按照 Jakob Jenkov 最新博客翻译,请随时存眷博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html。
本指南已做成中英文比较阅读版的 pdf 文档,有乐趣的伴侣可以去 Java并发东西包java.util.concurrent用户指南中英文比较阅读版.pdf[带书签] 举办下载。
1. java.util.concurrent – Java 并发东西包
Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包。这个包包括有一系列可以或许让 Java 的并发编程变得越发简朴轻松的类。在这个包被添加以前,你需要本身去动手实现本身的相关东西类。
本文我将带你一一认识 java.util.concurrent 包里的这些类,然后你可以实验着如安在项目中利用它们。本文中我将利用 Java 6 版本,我不确定这和 Java 5 版本里的是否有一些差别。我不会去表明关于 Java 并发的焦点问题 – 其背后的道理,也就是说,假如你对那些对象感乐趣,参考《Java 并发指南》。
半制品
本文很洪流平上照旧个 “半制品”,所以当你发明一些被遗漏的类或接口时,请耐性期待。在我空闲的时候会把它们加进来的。
2. 阻塞行列 BlockingQueue
java.util.concurrent 包里的 BlockingQueue 接口暗示一个线程安顿入和提取实例的行列。本小节我将给你演示如何利用这个 BlockingQueue。本节不会接头如安在 Java 中实现一个你本身的 BlockingQueue。假如你对谁人感乐趣,参考《Java 并发指南》
BlockingQueue 用法
BlockingQueue 凡是用于一个线程出产工具,而别的一个线程消费这些工具的场景。下图是对这个道理的叙述:
一个线程往里边放,别的一个线程从里边取的一个 BlockingQueue。
一个线程将会一连出产新工具并将其插入到行列之中,直到行列到达它所能容纳的临界点。也就是说,它是有限的。假如该阻塞行列达到了其临界点,认真出产的线程将会在往里边插入新工具时产生阻塞。它会一直处于阻塞之中,直到认真消费的线程从行列中拿走一个工具。认真消费的线程将会一直从该阻塞行列中拿出工具。假如消费线程实验去从一个空的行列中提取工具的话,这个消费线程将会处于阻塞之中,直到一个出产线程把一个工具丢举办列。
BlockingQueue 的要领
BlockingQueue 具有 4 组差异的要领用于插入、移除以及对行列中的元素举办查抄。假如请求的操纵不能获得当即执行的话,每个要领的表示也差异。这些要领如下:
四组差异的行为方法表明:
抛异常:假如试图的操纵无法当即执行,抛一个异常。
特定值:假如试图的操纵无法当即执行,返回一个特定的值(经常是 true / false)。
阻塞:假如试图的操纵无法当即执行,该要领挪用将会产生阻塞,直到可以或许执行。
超时:假如试图的操纵无法当即执行,该要领挪用将会产生阻塞,直到可以或许执行,但期待时间不会高出给定值。返回一个特定值以奉告该操纵是否乐成(典范的是 true / false)。
无法向一个 BlockingQueue 中插入 null。假如你试图插入 null,BlockingQueue 将会抛出一个 NullPointerException。
可以会见到 BlockingQueue 中的所有元素,而不只仅是开始和竣事的元素。好比说,你将一个工具放入行列之中以期待处理惩罚,但你的应用想要将其打消掉。那么你可以挪用诸如 remove(o) 要领来将行列之中的特定工具举办移除。可是这么干效率并不高(译者注:基于行列的数据布局,获取除开始或竣事位置的其他工具的效率不会太高),因此你只管不要用这一类的要领,除非你确实不得不那么做。
BlockingQueue 的实现
BlockingQueue 是个接口,你需要利用它的实现之一来利用 BlockingQueue。java.util.concurrent 具有以下 BlockingQueue 接口的实现(Java 6):
Java 中利用 BlockingQueue 的例子
这里是一个 Java 中利用 BlockingQueue 的示例。本示例利用的是 BlockingQueue 接口的 ArrayBlockingQueue 实现。
首先,BlockingQueueExample 种别离在两个独立的线程中启动了一个 Producer 和 一个 Consumer。
Producer 向一个共享的 BlockingQueue 中注入字符串,而 Consumer 则会从中把它们拿出来。
public class BlockingQueueExample { public static void main(String[] args) throws Exception { 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); } }