`
auguslee
  • 浏览: 99772 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Java中BlcokingQueue的使用

阅读更多
直接上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_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java中可使用的datatable

    使用修改如下(example文件夹下的java代码如下修改): //使用datatable DataTable dtb = new DataTable(); data.common.JdbcAdapter dAdapter = new JdbcAdapter(); dAdapter.fillDataTable(dtb, rs); //...

    Java 中文入门学习手册合集[chm版]

    第一章 Java语言的产生及其特点 第二章 Java程序开发与运行环境 第三章 Java程序设计基础 第四章 Java应用程序的基本框架 第五章 Java的类 第六章 Java图形用户接口 第七章 多线程 第八章 Java的"异常" 第九...

    java 中文字转为英文

    java 中文字转为英文java 中文字转为英文java 中文字转为英文

    Java 使用poi导入excel 并使用xml做数据验证

    在Java中,我们可以使用`DataValidationHelper`和`DataValidationConstraint`来创建验证规则,应用到特定的单元格或单元格范围。 XML解析在这个过程中起着关键作用。Java标准库中的`javax.xml.parsers....

    java中文排序,数字字母汉字排序

    在Java编程语言中,对包含中文、数字和字母的数据进行排序是一项常见的任务。这个场景下,我们关注的是如何实现一个自定义的排序规则,按照数字、字母和汉字的顺序进行排列。以下是对这一主题的详细解释。 首先,...

    Java API文档 中文网页版

    Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、方法和常量的详细说明。这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,...

    ElasticSearch Java API 中文文档

    9. **脚本API (Script API)**: 讲述了如何在ElasticSearch中使用脚本API进行更复杂的查询和数据更新。 10. **管理API (Administration API)**: 介绍了如何使用Java API进行索引管理(Indices Administration)、...

    java源码包---java 源码 大量 实例

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    Head First Java 中文高清版pdf

    除此之外,书中的案例涵盖了集合框架,包括ArrayList、LinkedList、HashMap等,这些都是Java开发中不可或缺的数据结构。此外,还会介绍泛型、枚举和注解,这些都是现代Java编程中的重要元素。 最后,书籍还讲解了...

    java 实现国际化 中英文语言切换

    在这个主题中,我们将深入探讨如何使用Java和JSP进行语言切换,以满足用户对中英文显示的需求。 1. **Java 国际化基础** Java 提供了 `java.util.Locale` 类来表示不同的语言环境,如英文(`en`)和中文(`zh`)。...

    Java+flex使用dom4j读写xml

    这个小例子是使用Java作为服务端、Flex做前台,对一个xml文件的读取和写入。 环境:MyEclipse6.0.1+Flex3...总结:对Flex和Java对象之间的转换还要进一步的研究,认识到Flex中样式的重要性。Flex的控件还要进一步学习。

    java调用openssl生成证书

    在这个过程中,我们通常会使用OpenSSL命令行工具,然后通过Java程序来调用这些系统命令。下面将详细讲解这个过程以及涉及的相关知识点。 首先,OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现...

    java jdk 8 帮助文档 中文 文档 chm 谷歌翻译

    JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷歌翻译,非人工翻译。准确性不能保证,请与英文版配合使用 ...

    使用java调用jenkins api

    在实际项目中,使用Java调用Jenkins API能实现自动化测试、自动化部署等任务,提高工作效率。通过深入学习和实践,你可以创建更复杂的CI/CD流程,并与其他工具集成,如Git、Docker等,实现完整的持续集成和持续部署...

    Java2Pas Java代码转pas代码

    由于Java和Pascal的语法差异,转换过程中可能会遇到一些挑战,比如Java中的匿名内部类在Pascal中可能需要不同的表示方式,或者Java的泛型在Pascal中可能没有直接对应的概念。 Java2Pas.exe很可能是这个工具的可执行...

    java 语音合成PCM转MP3

    在Java中,可以使用`javax.sound.sampled`包来处理PCM音频,包括读取、写入和转换PCM数据。 3. **音频编码**:从PCM到MP3的转换涉及到音频编码,这是一个将原始PCM数据压缩成更小的MP3文件的过程。通常,我们需要...

    锐浪Grid++Report报表web(Java)版使用手册

    锐浪Grid++Report报表Web(Java)版使用手册。 非常详细。 内容列表: 1.报表设计器安装文件 2.报表设计器的使用 3.报表页面和JS文件及使用手册 4.报表后台代码的文件及使用手册(整合Struts) (附加.html,.js,.java,....

    把wsdl文件转换成java类 使用wsdl2Java工具

    为了在Java环境中与这些Web服务交互,我们需要将WSDL文件转换为Java类,这就是`wsdl2java`工具的作用。 `wsdl2java`是Apache Axis项目的一部分,它是一个强大的工具,可以自动生成Java客户端和服务端代码,这些代码...

    java中文帮助文档

    java中文帮助文档java中文帮助文档java中文帮助文档java中文帮助文档java中文帮助文档java中文帮助文档java中文帮助文档java中文帮助文档java中文帮助文档

Global site tag (gtag.js) - Google Analytics