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();
}
}
分享到:
相关推荐
在TestBlockingQueueAndExecutorService这个测试用例中,作者可能演示了如何创建一个ExecutorService实例,然后将Runnable或Callable任务提交给它执行,同时使用BlockingQueue作为线程间的通信工具。通过这种方式,...
在描述中提到的"测试黑盒调用方法成功与否",意味着这个工具可能包含了各种测试用例,这些用例会模拟用户或者其他系统组件对目标方法的调用,并检查返回结果是否符合预期。黑盒测试的关键在于设计合适的输入,观察并...
【Java毕业设计】MarketCommander's java-code是一个典型的Java项目,通常包含一系列的类、接口、测试用例等,用于实现特定的业务功能。在这个项目中,MarketCommander可能是一个模拟市场策略或交易管理的系统。以下...
测试用例通常用来验证电梯调度算法的正确性,包括各种边界条件和异常情况。性能分析则可能涉及时间复杂度和空间复杂度的评估,以及可能的优化措施,比如使用更高效的算法或数据结构,以提高系统的响应速度和资源利用...
设计测试用例来验证生产者和消费者的正确性,包括各种边界情况,如缓冲区满时生产者尝试生产,缓冲区空时消费者尝试消费等。通过观察运行结果和日志,分析是否出现线程安全问题,如数据丢失或缓冲区溢出。 5. **...
9. **测试用例**:提供的源码可能包含了测试用例,模拟不同的线程错误场景,以验证"CheckThread"的正确性和有效性。 通过使用"CheckThread"这样的工具,开发者可以在多线程应用中更有效地调试和管理错误,提高代码...
8. **测试与调试**:为了确保程序的正确性,需要编写测试用例,模拟不同的生产者和消费者行为,观察并验证程序在各种情况下的表现。 通过这个课程设计,学生不仅能学习到Java多线程编程的基础,还能了解并发编程中...
JUnit或其他测试框架可以用来创建测试用例,模拟并发请求,验证线程池的配置是否合理,如是否能正确处理任务队列的满载情况,线程超时或中断的响应等。 总的来说,Java线程和线程池的应用需要深入理解并发编程原理...
- 单元测试:编写测试用例覆盖关键功能 - 集成测试:测试不同组件之间的交互 - 系统测试:全面验证整个系统的功能 - 性能测试:评估系统的负载和压力承受能力 - 安全测试:检查潜在的安全漏洞 - 回归测试:...
9. **单元测试与集成测试**:为了确保代码质量,开发者可能会编写JUnit或TestNG测试用例,进行单元测试和集成测试,保证各模块的功能正确性。 10. **版本控制**:My_webdemo-master的命名方式暗示它可能是一个Git...
JUnit是Java中常用的测试框架,可以帮助我们编写和运行测试用例。 通过这个Java实现的简易版QQ,你可以深入学习到Java编程、网络通信和并发编程等多个重要领域,并且能够将理论知识应用到实际项目中,这对于提高...
JUnit和TestNG等工具可以帮助开发者编写和执行测试用例。 以上就是关于“Java五子棋游戏”项目的一些关键技术点,这些知识涵盖了Java编程、软件架构设计以及游戏开发等多个方面。对于学习Java或游戏开发的人来说,...
为了调试和测试队列模拟,源码中可能会包含JUnit测试用例,利用Java的单元测试框架对队列操作进行验证。通过编写断言和模拟输入输出,我们可以确保队列的逻辑正确无误。 总的来说,这个项目为我们提供了一个学习...
8. **单元测试**:强调了单元测试的重要性,提倡采用TDD(测试驱动开发)模式,编写覆盖率高的测试用例,以确保代码质量。 9. **安全性**:包括输入验证、密码加密、敏感信息保护等方面的指导,以防止安全漏洞。 ...
JUnit是Java常用的单元测试框架,可以帮助开发者编写和执行测试用例。 这个项目是一个很好的实践平台,可以帮助开发者深入理解Java网络编程、多线程、GUI开发以及数据处理等相关知识,并提升实际项目开发的能力。...
7. **并发测试**:编写并发测试用例,使用工具如JMeter、LoadRunner进行压力测试,确保系统的稳定性和性能。 8. **监控与调试**:学习使用JConsole、VisualVM等工具监控线程状态,定位和解决问题。 9. **阿里巴巴...
10. **单元测试**:为了确保代码的正确性,我们会编写单元测试用例,使用JUnit或其他测试框架对红包分配逻辑进行测试。 以上就是关于"RedPacket.rar"文件可能涉及的Java技术点和编程概念。具体的实现细节将取决于...
JUnit等单元测试框架可以帮助编写测试用例,模拟不同情况下的电梯行为,确保其在各种情况下都能正常工作。 8. **性能优化**:在大型建筑中,电梯系统需要高效运行,减少等待时间和能源消耗。这可能涉及优化电梯调度...
13. **测试与调试**:单元测试、集成测试是保证代码质量的重要手段,JUnit和Mockito等工具可用于编写测试用例。IDE如IntelliJ IDEA、Eclipse的调试功能也是必不可少的。 通过深入研究这个项目源码,开发者不仅能...
1. **单元测试**:编写全面的单元测试用例,确保代码功能的正确性。 2. **集成测试**:对系统集成部分进行测试,确保模块间的交互无误。 七、持续集成与代码审查 1. **代码提交**:遵循统一的提交信息格式,提交...