`
auguslee
  • 浏览: 99657 次
  • 性别: 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 中文入门学习手册合集[chm版]

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

    java 中文字转为英文

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

    java朗读中文字符串.zip

    在Java中,这种功能通常依赖于Java的Text-to-Speech API,也就是Java Speech API (JSAPI) 的一部分,特别是`javax.speech`和`edu.speech`这两个包中的类。 Java Text-to-Speech (TTS) 是一项将文本数据转化为可听见...

    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 jdk 8 帮助文档 中文 文档 chm 谷歌翻译

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

    java使用ldap修改ad域用户密码

    在 Java 中,我们可以使用 LDAP 客户端库来连接到 Active Directory 域控制器,并对用户密码进行修改。下面是一个简单的示例代码: ```java public static void main(String[] args) throws UnknownHostException, ...

    Java2Pas Java代码转pas代码

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

    使用IK Analyzer实现中文分词之Java实现(包含所有工具包)

    1、lucene-core-3.6.0.jar 2、IKAnalyzer2012.jar(主jar包) 3、IKAnalyzer.cfg.xml(分词器扩展配置文件) 4、stopword.dic(停止词典) 5、IkSegmentation.java(样例类)

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

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

    Java 面经手册·小傅哥.pdf

    当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、斐波那契(Fibonacci)散列法还有黄金分割点的使用等等。 适合人群 1. 具备一定编程基础,工作1-3年的研发...

    JAVA将一个数据中数据定时自动复制(抽取)到另一个数据库

    本文将深入探讨如何使用Java编程语言实现从一个数据库中定时自动抽取数据并复制到另一个数据库,以达到数据库间的实时或近实时同步。 首先,我们需要了解基础概念。Java是一种广泛使用的面向对象的编程语言,具有...

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器...另包含一篇网文:在java中使用TreeMap进行中文排序

    java调用openssl生成证书

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

Global site tag (gtag.js) - Google Analytics