如何将一个just对象实例传递给java中的一个线程,这样即使实例值得到更新也不应该影响使用它的线程

Ank*_*hag 4 java multithreading

我正在开发一个我不断收到消息的应用程序.我将这些消息存储在内存数据结构中(比如List).我想将这些消息写入文件,但只有在列表大小达到某个阈值后才说100条消息(对消息执行批处理).一种方法是我可以在收到每条消息后简单地检查列表大小,如果达到阈值,则调用函数将消息写入文件.但这种方法的问题是:

  1. 调用函数可能需要无限期地等待,直到所有消息都写入文件
  2. 传入的消息可能在此过程中丢失,或者可能需要等待存储在列表中.

其他方法可能是生成一个新线程,它将独立地将消息写入文件.但是当我将列表(包含消息)传递给线程以执行写操作时,它会被新消息更新,这些消息会不断进入.因此,新到达的消息也会被写入到不期望的文件中.

这不应该发生,因为我打算在下一批中写入新消息.

有人可以建议我这个要求的解决方案,或上述方法的任何改进,可以解决我的问题.

Pet*_*rey 5

我发现更清洁的解决方案是支持自动批处理.即批量大小随输入数据的速率调整.

为此,您可以使用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)

这种方法的好处是,如果生产者非常慢,你就不会让元素保持不合理的长,但随着速度的增加,批量大小自然会增长到跟上生产者的任何东西,这意味着你不需要决定使用的最佳批量大小.

  • +1我真的很喜欢这种方法.提示:强调(为清楚起见)`list`排入文件. (2认同)