`

BlockingQueue 测试用例

 
阅读更多
package test;
import java.io.File;
import java.io.FileFilter;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,
 * 如果队列已经满了,就等待直到有空闲节点;后者从head取一个对象,如果没有对象,就等待直到有可取的对象。
 * 
 * 下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,另外四个写线程用于取出文件对象,为了模拟写操作耗时长的特点,
 * 特让线程睡眠一段随机长度的时间
 * 。另外,该Demo也使用到了线程池和原子整型(AtomicInteger),AtomicInteger可以在并发情况下达到原子化更新
 * ,避免使用了synchronized
 * ,而且性能非常高。由于阻塞队列的put和take操作会阻塞,为了使线程退出,特在队列中添加了一个“标识”,算法中也叫“哨兵
 * ”,当发现这个哨兵后,写线程就退出。 当然线程池也要显式退出了。
 * 
 * @author lhj
 * 
 */

public class TestBlockingQueue {
	static long randomTime() {
		return (long) (Math.random() * 1000);
	}
	public static void main(String[] args) {
		//能容纳100个文件
		final BlockingQueue queue = new LinkedBlockingQueue(100);
		//线程池
		final ExecutorService exec = Executors.newFixedThreadPool(5);
		final File root = new File("E://nio_framework-0.9.5_all");
		//完成标志
		final File exitFile = new File("");
		//读个数
		final AtomicInteger rc = new AtomicInteger();
		//写个数
		final AtomicInteger wc = new AtomicInteger();
		//读线程
		Runnable read = new Runnable() {
			public void run() {
				scanFile(root);
				scanFile(exitFile);
			}
			public void scanFile(File file) {
				if (file.isDirectory()) {
					File[] files = file.listFiles(new FileFilter() {
						public boolean accept(File pathname) {
							return pathname.isDirectory()
									|| pathname.getPath().endsWith(".java");
						}
					});
					for (File one : files) {
						scanFile(one);
					}
				} else {
					try {
						int index = rc.incrementAndGet();
						System.out.println("Read0: " + index + " "
								+ file.getPath());
						queue.put(file);
					} catch (InterruptedException e) {
					}
				}
			}
		};
		exec.submit(read);
		//四个写线程
		for (int index = 0; index < 4; index++) {
			// write thread  
			final int NO = index;
			Runnable write = new Runnable() {
				String threadName = "Write" + NO;
				public void run() {
					while (true) {
						try {
							Thread.sleep(randomTime());
							int index = wc.incrementAndGet();
							File file = (File) queue.take();
							//队列已经无对象  
							if (file == exitFile) {
								// 再次添加”标志”,以让其他线程正常退出  
								queue.put(exitFile);
								break;
							}
							System.out.println(threadName + ": " + index + " "
									+ file.getPath());
						} catch (InterruptedException e) {
						}
					}
				}
			};
			exec.submit(write);
		}
		exec.shutdown();
	}
}
分享到:
评论

相关推荐

    2011.08.30(2)——— java BlockingQueue ExecutorService

    在TestBlockingQueueAndExecutorService这个测试用例中,作者可能演示了如何创建一个ExecutorService实例,然后将Runnable或Callable任务提交给它执行,同时使用BlockingQueue作为线程间的通信工具。通过这种方式,...

    猎狗demo测试

    在描述中提到的"测试黑盒调用方法成功与否",意味着这个工具可能包含了各种测试用例,这些用例会模拟用户或者其他系统组件对目标方法的调用,并检查返回结果是否符合预期。黑盒测试的关键在于设计合适的输入,观察并...

    【Java毕业设计】MarketCommander's java-code,毕业设计代码.zip

    【Java毕业设计】MarketCommander's java-code是一个典型的Java项目,通常包含一系列的类、接口、测试用例等,用于实现特定的业务功能。在这个项目中,MarketCommander可能是一个模拟市场策略或交易管理的系统。以下...

    精选_基于JAVA的操作系统电梯调度_源码打包

    测试用例通常用来验证电梯调度算法的正确性,包括各种边界条件和异常情况。性能分析则可能涉及时间复杂度和空间复杂度的评估,以及可能的优化措施,比如使用更高效的算法或数据结构,以提高系统的响应速度和资源利用...

    生产者消费者问题设计与实现.doc

    设计测试用例来验证生产者和消费者的正确性,包括各种边界情况,如缓冲区满时生产者尝试生产,缓冲区空时消费者尝试消费等。通过观察运行结果和日志,分析是否出现线程安全问题,如数据丢失或缓冲区溢出。 5. **...

    基于Java的实例源码-线程错误捕获工具 CheckThread.zip

    9. **测试用例**:提供的源码可能包含了测试用例,模拟不同的线程错误场景,以验证"CheckThread"的正确性和有效性。 通过使用"CheckThread"这样的工具,开发者可以在多线程应用中更有效地调试和管理错误,提高代码...

    课程设计之生产者与消费者 java语言编写

    8. **测试与调试**:为了确保程序的正确性,需要编写测试用例,模拟不同的生产者和消费者行为,观察并验证程序在各种情况下的表现。 通过这个课程设计,学生不仅能学习到Java多线程编程的基础,还能了解并发编程中...

    java线程异常

    JUnit或其他测试框架可以用来创建测试用例,模拟并发请求,验证线程池的配置是否合理,如是否能正确处理任务队列的满载情况,线程超时或中断的响应等。 总的来说,Java线程和线程池的应用需要深入理解并发编程原理...

    阿里各岗位技术面试题含答案最新.docx

    - 单元测试:编写测试用例覆盖关键功能 - 集成测试:测试不同组件之间的交互 - 系统测试:全面验证整个系统的功能 - 性能测试:评估系统的负载和压力承受能力 - 安全测试:检查潜在的安全漏洞 - 回归测试:...

    Java游戏用户社交系统源码.zip

    9. **单元测试与集成测试**:为了确保代码质量,开发者可能会编写JUnit或TestNG测试用例,进行单元测试和集成测试,保证各模块的功能正确性。 10. **版本控制**:My_webdemo-master的命名方式暗示它可能是一个Git...

    用java做的简易版QQ,只适用于学习

    JUnit是Java中常用的测试框架,可以帮助我们编写和运行测试用例。 通过这个Java实现的简易版QQ,你可以深入学习到Java编程、网络通信和并发编程等多个重要领域,并且能够将理论知识应用到实际项目中,这对于提高...

    Java 五子棋游戏

    JUnit和TestNG等工具可以帮助开发者编写和执行测试用例。 以上就是关于“Java五子棋游戏”项目的一些关键技术点,这些知识涵盖了Java编程、软件架构设计以及游戏开发等多个方面。对于学习Java或游戏开发的人来说,...

    Queue-Simulation_java_learnvwf_源码.zip

    为了调试和测试队列模拟,源码中可能会包含JUnit测试用例,利用Java的单元测试框架对队列操作进行验证。通过编写断言和模拟输入输出,我们可以确保队列的逻辑正确无误。 总的来说,这个项目为我们提供了一个学习...

    阿里巴巴Java开发手册1.5.0华山版.zip

    8. **单元测试**:强调了单元测试的重要性,提倡采用TDD(测试驱动开发)模式,编写覆盖率高的测试用例,以确保代码质量。 9. **安全性**:包括输入验证、密码加密、敏感信息保护等方面的指导,以防止安全漏洞。 ...

    java类QQ聊天(源码)

    JUnit是Java常用的单元测试框架,可以帮助开发者编写和执行测试用例。 这个项目是一个很好的实践平台,可以帮助开发者深入理解Java网络编程、多线程、GUI开发以及数据处理等相关知识,并提升实际项目开发的能力。...

    阿里专家级并发编程架构师教程[视频课程].txt打包整理.zip

    7. **并发测试**:编写并发测试用例,使用工具如JMeter、LoadRunner进行压力测试,确保系统的稳定性和性能。 8. **监控与调试**:学习使用JConsole、VisualVM等工具监控线程状态,定位和解决问题。 9. **阿里巴巴...

    RedPacket.rar

    10. **单元测试**:为了确保代码的正确性,我们会编写单元测试用例,使用JUnit或其他测试框架对红包分配逻辑进行测试。 以上就是关于"RedPacket.rar"文件可能涉及的Java技术点和编程概念。具体的实现细节将取决于...

    利用java设计一个电梯模拟控制

    JUnit等单元测试框架可以帮助编写测试用例,模拟不同情况下的电梯行为,确保其在各种情况下都能正常工作。 8. **性能优化**:在大型建筑中,电梯系统需要高效运行,减少等待时间和能源消耗。这可能涉及优化电梯调度...

    基于Java语言开发IM即时通讯聊天系统源码.zip

    13. **测试与调试**:单元测试、集成测试是保证代码质量的重要手段,JUnit和Mockito等工具可用于编写测试用例。IDE如IntelliJ IDEA、Eclipse的调试功能也是必不可少的。 通过深入研究这个项目源码,开发者不仅能...

    阿里巴巴Java开发规范文档.rar

    1. **单元测试**:编写全面的单元测试用例,确保代码功能的正确性。 2. **集成测试**:对系统集成部分进行测试,确保模块间的交互无误。 七、持续集成与代码审查 1. **代码提交**:遵循统一的提交信息格式,提交...

Global site tag (gtag.js) - Google Analytics