直接上Thinking in Java 4th 的例子:
class MyUntil {
static void print(String str) {
System.out.println(str);
}
}
class Toast {
public enum Status {
DRY, BUTTERED, JAMED
}
private Status status = Status.DRY;
private final int id;
public Toast(int id) {
this.id = id;
}
public void butter() {
status = Status.BUTTERED;
}
public void jam() {
status = Status.JAMED;
}
public Status getStatus() {
return status;
}
public int getId() {
return id;
}
@Override
public String toString() {
return "Toast " + id + ": " + status;
}
}
class ToastQueue extends LinkedBlockingQueue<Toast> {
/**
*
*/
private static final long serialVersionUID = 1L;
}
class Toaster implements Runnable {
private ToastQueue toastQueue;
private int count = 0;
private Random rand = new Random(47);
public Toaster(ToastQueue tq) {
toastQueue = tq;
}
public void run() {
try {
while (!Thread.interrupted()) {
TimeUnit.MILLISECONDS.sleep(100 + rand.nextInt(500));
Toast t = new Toast(count++);
MyUntil.print(t.toString());
toastQueue.put(t);
}
} catch (InterruptedException e) {
MyUntil.print("Toaster interrupted");
}
MyUntil.print("Toaster off");
}
}
class Butterer implements Runnable {
private ToastQueue dryQueue, butterQueue;
public Butterer(ToastQueue dry, ToastQueue buttered) {
dryQueue = dry;
butterQueue = buttered;
}
public void run() {
try {
while (!Thread.interrupted()) {
Toast t = dryQueue.take();
t.butter();
MyUntil.print(t.toString());
butterQueue.put(t);
}
} catch (InterruptedException e) {
MyUntil.print("Butterer interrupted");
}
MyUntil.print("Butter off");
}
}
class Jammer implements Runnable {
private ToastQueue butteredQueue, finishedQueue;
public Jammer(ToastQueue buttered, ToastQueue finished) {
butteredQueue = buttered;
finishedQueue = finished;
}
@Override
public void run() {
try {
while (!Thread.interrupted()) {
Toast t = butteredQueue.take();
t.jam();
MyUntil.print(t.toString());
finishedQueue.put(t);
}
} catch (InterruptedException e) {
MyUntil.print("Jammer Interruped ");
}
MyUntil.print("Jammer off");
}
}
class ToastEater implements Runnable {
private ToastQueue finishedQueue;
private int counter = 0;
public ToastEater(ToastQueue finished) {
finishedQueue = finished;
}
public void run() {
try {
while (!Thread.interrupted()) {
Toast t = finishedQueue.take();
if (t.getId() != counter++
|| t.getStatus() != Toast.Status.JAMED) {
MyUntil.print(">>>>>>>>Error: " + t.toString());
System.exit(1);
} else {
MyUntil.print("Chomp! " + t);
MyUntil.print("\n");
}
}
} catch (InterruptedException e) {
MyUntil.print("Eater interrupted !");
}
MyUntil.print("Eater off");
}
}
public class ToastMatic {
public static void main(String[] args) throws InterruptedException {
ToastQueue dryQueue = new ToastQueue(), butteredQueue = new ToastQueue(), finishedQueue = new ToastQueue();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new ToastEater(finishedQueue));
exec.execute(new Toaster(dryQueue));
exec.execute(new Butterer(dryQueue, butteredQueue));
exec.execute(new Jammer(butteredQueue, finishedQueue));
TimeUnit.SECONDS.sleep(5);
exec.shutdownNow();
}
}
BlockingQueue提供了一种便捷的方式处理资源共享, 从而避免了用synchronized带来的繁琐, 以及用synchronized方法带来的死锁。
输出结果
Toast 0: DRY
Toast 0: BUTTERED
Toast 0: JAMED
Chomp! Toast 0: JAMED
Toast 1: DRY
Toast 1: BUTTERED
Toast 1: JAMED
Chomp! Toast 1: JAMED
Toast 2: DRY
Toast 2: BUTTERED
Toast 2: JAMED
Chomp! Toast 2: JAMED
Toast 3: DRY
Toast 3: BUTTERED
Toast 3: JAMED
Chomp! Toast 3: JAMED
Toast 4: DRY
Toast 4: BUTTERED
Toast 4: JAMED
Chomp! Toast 4: JAMED
Toast 5: DRY
Toast 5: BUTTERED
Toast 5: JAMED
Chomp! Toast 5: JAMED
Toast 6: DRY
Toast 6: BUTTERED
Toast 6: JAMED
Chomp! Toast 6: JAMED
Toast 7: DRY
Toast 7: BUTTERED
Toast 7: JAMED
Chomp! Toast 7: JAMED
Toast 8: DRY
Toast 8: BUTTERED
Toast 8: JAMED
Chomp! Toast 8: JAMED
Toast 9: DRY
Toast 9: BUTTERED
Toast 9: JAMED
Chomp! Toast 9: JAMED
Toast 10: DRY
Toast 10: BUTTERED
Toast 10: JAMED
Chomp! Toast 10: JAMED
Toast 11: DRY
Toast 11: BUTTERED
Toast 11: JAMED
Chomp! Toast 11: JAMED
Toast 12: DRY
Toast 12: BUTTERED
Toast 12: JAMED
Chomp! Toast 12: JAMED
Toast 13: DRY
Toast 13: BUTTERED
Toast 13: JAMED
Chomp! Toast 13: JAMED
Toast 14: DRY
Toast 14: BUTTERED
Toast 14: JAMED
Chomp! Toast 14: JAMED
Eater interrupted !
Eater off
Jammer Interruped
Jammer off
Butterer interrupted
Butter off
Toaster interrupted
Toaster off
分享到:
相关推荐
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
使用修改如下(example文件夹下的java代码如下修改): //使用datatable DataTable dtb = new DataTable(); data.common.JdbcAdapter dAdapter = new JdbcAdapter(); dAdapter.fillDataTable(dtb, rs); //...
第一章 Java语言的产生及其特点 第二章 Java程序开发与运行环境 第三章 Java程序设计基础 第四章 Java应用程序的基本框架 第五章 Java的类 第六章 Java图形用户接口 第七章 多线程 第八章 Java的"异常" 第九...
java 中文字转为英文java 中文字转为英文java 中文字转为英文
在Java中,我们可以使用`DataValidationHelper`和`DataValidationConstraint`来创建验证规则,应用到特定的单元格或单元格范围。 XML解析在这个过程中起着关键作用。Java标准库中的`javax.xml.parsers....
在Java编程语言中,对包含中文、数字和字母的数据进行排序是一项常见的任务。这个场景下,我们关注的是如何实现一个自定义的排序规则,按照数字、字母和汉字的顺序进行排列。以下是对这一主题的详细解释。 首先,...
在Java中,这种功能通常依赖于Java的Text-to-Speech API,也就是Java Speech API (JSAPI) 的一部分,特别是`javax.speech`和`edu.speech`这两个包中的类。 Java Text-to-Speech (TTS) 是一项将文本数据转化为可听见...
Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、方法和常量的详细说明。这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
除此之外,书中的案例涵盖了集合框架,包括ArrayList、LinkedList、HashMap等,这些都是Java开发中不可或缺的数据结构。此外,还会介绍泛型、枚举和注解,这些都是现代Java编程中的重要元素。 最后,书籍还讲解了...
在这个主题中,我们将深入探讨如何使用Java和JSP进行语言切换,以满足用户对中英文显示的需求。 1. **Java 国际化基础** Java 提供了 `java.util.Locale` 类来表示不同的语言环境,如英文(`en`)和中文(`zh`)。...
在这个过程中,我们通常会使用OpenSSL命令行工具,然后通过Java程序来调用这些系统命令。下面将详细讲解这个过程以及涉及的相关知识点。 首先,OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现...
JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷歌翻译,非人工翻译。准确性不能保证,请与英文版配合使用 ...
在 Java 中,我们可以使用 LDAP 客户端库来连接到 Active Directory 域控制器,并对用户密码进行修改。下面是一个简单的示例代码: ```java public static void main(String[] args) throws UnknownHostException, ...
在实际项目中,使用Java调用Jenkins API能实现自动化测试、自动化部署等任务,提高工作效率。通过深入学习和实践,你可以创建更复杂的CI/CD流程,并与其他工具集成,如Git、Docker等,实现完整的持续集成和持续部署...
由于Java和Pascal的语法差异,转换过程中可能会遇到一些挑战,比如Java中的匿名内部类在Pascal中可能需要不同的表示方式,或者Java的泛型在Pascal中可能没有直接对应的概念。 Java2Pas.exe很可能是这个工具的可执行...
在这个Java开发的OCR程序中,我们聚焦于如何使用Java来实现这一功能,特别是针对中文字符的识别。 首先,我们需要了解Java中的OCR库。Tesseract是一个广泛使用的开源OCR引擎,它支持多种语言,包括中文。在Java项目...
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
在Java中,可以使用`javax.sound.sampled`包来处理PCM音频,包括读取、写入和转换PCM数据。 3. **音频编码**:从PCM到MP3的转换涉及到音频编码,这是一个将原始PCM数据压缩成更小的MP3文件的过程。通常,我们需要...
锐浪Grid++Report报表Web(Java)版使用手册。 非常详细。 内容列表: 1.报表设计器安装文件 2.报表设计器的使用 3.报表页面和JS文件及使用手册 4.报表后台代码的文件及使用手册(整合Struts) (附加.html,.js,.java,....