如何在使用并行方法时使 foreach 循环线程中的单个任务安全?


IntStream.rangeClosed(0, 100).parallel().forEach(x -> {
System.out.println(x);
// Thread safe task
someThreadSafeTask();
});

考虑将 Id 列表附加到某个 URl 并进行 http 调用,我需要将信息保存到应该是线程安全的文件中?如何处理这个?

如果您需要让多个线程写入同一个文件,答案很简单,打开文件,写入您必须执行的所有操作,然后同步关闭它。即使您以某种方式设法让线程按您希望的顺序运行,您仍然会遇到以下问题:

  1. 其他线程仍需要等待轮到它们运行。
  2. 每次您都会打开文件、写入文件和关闭文件。这是非常耗时的。

如果您需要写入多个文件,那么您可以实现每个文件队列并让使用者写入相应的文件(但仍然最多您将有 N 个线程,其中 N 是您要写入的不同文件的数量(。

最新更新