Ank*_*hag 4 java multithreading
我正在开发一个我不断收到消息的应用程序.我将这些消息存储在内存数据结构中(比如List).我想将这些消息写入文件,但只有在列表大小达到某个阈值后才说100条消息(对消息执行批处理).一种方法是我可以在收到每条消息后简单地检查列表大小,如果达到阈值,则调用函数将消息写入文件.但这种方法的问题是:
其他方法可能是生成一个新线程,它将独立地将消息写入文件.但是当我将列表(包含消息)传递给线程以执行写操作时,它会被新消息更新,这些消息会不断进入.因此,新到达的消息也会被写入到不期望的文件中.
这不应该发生,因为我打算在下一批中写入新消息.
有人可以建议我这个要求的解决方案,或上述方法的任何改进,可以解决我的问题.
我发现更清洁的解决方案是支持自动批处理.即批量大小随输入数据的速率调整.
为此,您可以使用BlockingQueue
// unbound queue will not block the producer.
final BlockingQueue<T> queue = new LinkedBlockingQueue<T>();
// to add an element.
queue.add(element);
// to get a batch of data
List<T> list = new ArrayList<T>(maxElements);
while(writing) {
T t = queue.take(); // wait for at least one element.
list.add(t);
queue.drainTo(list, maxElements-1);
// process list, e.g. write to a file.
list.clear();
}
Run Code Online (Sandbox Code Playgroud)
这种方法的好处是,如果生产者非常慢,你就不会让元素保持不合理的长,但随着速度的增加,批量大小自然会增长到跟上生产者的任何东西,这意味着你不需要决定使用的最佳批量大小.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |