一个简单的 Java 自动批处理队列

实际中可能有这样的应用场景,获得一个记录不须要当即去处理它,而是等累积到必定数量时再批量处理它们。咱们能够用一个计数器,来一个加一个,量大时一块处理,而后又重零开始计数。若是记录的来源单一还好办,要是有多个数据源来提供记录就会有多线程环境下数据丢失的问题。java

这里我编写了一个最简单的任务批处理的队列,构造了告诉它批处理数量,消费者,而后就只管往队列里添加记录,队列在知足条件时自动进行批处理。由于内部使用的是 BlockingQuque 来存储记录,因此多线程往里同时添加记录也不要紧,最后的未达到 batchSize, 的那些记录可主动调用 completeAll() 函数或在达到 timeout 后来触发批处理,而且结束队列内的循环线程。安全

注意: 多线程环境下往一个无线程保护的集合或结构中,如 ArrayList, LinkedList, HashMap, StringBuilder 中添加记录很是容易形成数据的丢失,而往有线程保护的目的地写东西就安全了,如 Vector, Hashtable, StringBuffer, BlockingQueue。固然性能上要付出一点代价,不过对于使用了可重入锁(ReentrantLock), 而非同步锁(synchronized) 的数据结构仍是能够放心使用的。数据结构

下面是 BatchQueue 的简单实现 阅读全文 >>多线程

相关文章
相关标签/搜索