数据异步处理是常见的需求。假设一下场景:
系统可能存在大量的数据并发写入某文件或某数据库表,而写入时还有相关业务处理,但是写入的结果对写入人来说毫不关心,无论是否写入成功都不重要,也不需要他立刻写入,慢慢写也可以。
于是,我们可以用一种思路来解决,即创建一个队列,外部代码只负责将要处理的数据写入该队列,另有一个线程,尝试清空该队列,也就是处理数据。
这就是一个比较简单的生产者和消费者的多线程模式,只是只有一个消费者,生产者很多。
对于这种模式Apache开源库中的commons-collections中的Buffer,尤其是BlockingBuffer很好的实现了我们所说的这个队列。
这个队列提供了一个"remove"方法,尝试获得队列中的数据,如果这个队列为空,这个方法将会阻塞,直到有数据为止。
接下来,我们可以将这个逻辑封装为以下类:写道
public class DataDealer
{
private final Buffer dataBuffer; // 数据buffer,因为使用匿名类,所以声明为final
public DataDealer()
{
// 初始化阻塞队列,原始队列是一个无边界的先进先出队列,也是Apache的同一个库中提供的
dataBuffer = BlockingBuffer.decorate( new UnboundedFifoBuffer( ) );
// 创建数据处理线程
Thread dealThread = new Thread( new Runnable()
{
public void run()
{
while ( true ) // 永远尝试获得数据并处理,因此死循环
{
System.out.println( "尝试获取要处理的数据" );
Object toDeal = dataBuffer.remove(); // 如果拿不到数据,就会阻塞
System.out.println( "dealing:" + toDeal ); // 真正的业务处理代码就在这里
System.out.println( "数据处理完毕" );
}
}
}, "数据处理线程" );
dealThread.setDaemon( true ); // 将这个数据处理线程设置为守护线程,如果主线程退出,那么个数据处理线程也自动退出
dealThread.start(); // 启动这个线程
}
// 外部业务方法就简单了,调用这个方法提交一个要处理的对象,其实现逻辑只是将其加入队列而已
public void addDataToWrite( Object toWhite )
{
dataBuffer.add( toWhite );
}
}
以上代码有一个注意事项,就是这个对象每创建一次就会发起一个线程,实际使用中,应该对其进一步改进,实现单例模式。
分享到:
相关推荐
Apache Commons ID 和 Commons Discovery 是两个在Java开发中广泛使用的开源库,它们是Apache软件基金会的项目,为开发者提供了丰富的工具和功能。 Apache Commons ID 主要关注于生成唯一标识(ID)的功能,它提供...
"commons-io-2.5.jar"是Apache Commons IO库的一个版本,针对JDK 1.6及更高版本设计。在这个版本中,用户可以找到许多优化和增强的功能。 1. **IOUtils**: IOUtils是Apache Commons IO中的核心类之一,它提供了大量...
Apache Commons 是一系列小型实用工具库,为Java开发者提供了丰富的功能扩展。这些库简化了常见的编程任务,提高了开发效率。在给定的压缩包文件中,包含的三个jar包分别是: 1. **Apache Commons BeanUtils** - `...
jar包大小:135KB commons-validator-1.3.1.jar jar包大小:93KB commons-transaction-1.2.jar jar包大小:141KB commons-scxml-0.6.jar jar包大小:254KB commons-primitives-1.0.jar jar包大小:60KB commons-pool-1.3....
赠送jar包:commons-math3-3.5.jar; 赠送原API文档:commons-math3-3.5-javadoc.jar; 赠送源代码:commons-math3-3.5-sources.jar; 赠送Maven依赖信息文件:commons-math3-3.5.pom; 包含翻译后的API文档:...
Commons-Lang 提供了许多许多通用的工具类集,提供了一些java.lang中类的扩展功能 Latka Commons-Latka 是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试. Launcher Launcher 组件是一个交叉平台的Java 应用...
在给定的压缩包文件中,`apache-commons-codec-1.4.jar`是这个库的一个版本,它包含了对BASE64以及其他编码格式的支持。 BASE64是一种用于将二进制数据转换为ASCII文本的编码方式,以便在不支持二进制传输的环境中...
Apache commons-csv-1.6 jar包,java7,针对csv的各种操作,需要的下载
使用apache commons-net包实现文件ftp上传
赠送jar包:commons-text-1.9.jar; 赠送原API文档:commons-text-1.9-javadoc.jar; 赠送源代码:commons-text-1.9-sources.jar; 赠送Maven依赖信息文件:commons-text-1.9.pom; 包含翻译后的API文档:commons-...
Apache Commons-logging 是一个流行的Java日志记录库,提供了一个轻量级的日志记录接口,允许开发者使用不同的日志实现工具。下面是对 Apache Commons-logging 的使用实例的详细介绍。 1. Commons-Loggin 简介 ...
赠送jar包:commons-lang3-3.4.jar; 赠送原API文档:commons-lang3-3.4-javadoc.jar; 赠送源代码:commons-lang3-3.4-sources.jar; 赠送Maven依赖信息文件:commons-lang3-3.4.pom; 包含翻译后的API文档:...
daemon-1.0.15-bin commons-dbutils-1.6-bin commons-digester3-3.2-bin commons-el-1.0 commons-email-1.4-bin commons-fileupload-1.0 commons-fileupload-1.1.1 commons-fileupload-1.1 commons-file upload-...
赠送jar包:commons-lang3-3.10.jar; 赠送原API文档:commons-lang3-3.10-javadoc.jar; 赠送源代码:commons-lang3-3.10-sources.jar; 赠送Maven依赖信息文件:commons-lang3-3.10.pom; 包含翻译后的API文档:...
赠送jar包:commons-pool2-2.0.jar; 赠送原API文档:commons-pool2-2.0-javadoc.jar; 赠送源代码:commons-pool2-2.0-sources.jar; 赠送Maven依赖信息文件:commons-pool2-2.0.pom; 包含翻译后的API文档:...
本主题将详细解析标题和描述中提及的三个核心库:`commons-dbcp-1.2.1.jar`、`commons-pool-1.4.jar`以及`commons-collections-3.2.jar`,它们如何协同工作以提供高效的数据库连接管理服务。 1. **Apache Commons ...
赠送jar包:commons-compress-1.21.jar; 赠送原API文档:commons-compress-1.21-javadoc.jar; 赠送源代码:commons-compress-1.21-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.21.pom; 包含翻译后...
赠送jar包:commons-collections4-4.1.jar; 赠送原API文档:commons-collections4-4.1-javadoc.jar; 赠送源代码:commons-collections4-4.1-sources.jar; 赠送Maven依赖信息文件:commons-collections4-4.1.pom;...
赠送jar包:commons-lang3-3.9.jar; 赠送原API文档:commons-lang3-3.9-javadoc.jar; 赠送源代码:commons-lang3-3.9-sources.jar; 赠送Maven依赖信息文件:commons-lang3-3.9.pom; 包含翻译后的API文档:...
apache commons jar(commons所有的jar包... apache-sanselan-incubating-0.97-bin bcel-5.2 commons-beanutils-1.9.2-bin commons-chain-1.2-bin commons-cli-1.3.1-bin commons-codec-1.10-bin commons-collections4-4