Java:许多线程或进程读取文件

Java: Many threads or processes reading a file

提问人:Harry 提问时间:11/11/2023 最后编辑:Harry 更新时间:11/11/2023 访问量:58

问:

我有一个线程将事件实时写入文件。

我希望在相同或不同的进程中拥有大量读取器线程,可能是虚拟线程,使用 .(编辑:每个读取器线程都使用自己的 FileInputStream 实例。FileInputStream

假设读取器线程在执行读取之前始终检查返回的值,那么在读取文件的相同或不同部分时,它们是否会在多核计算机上阻塞或相互争用?如果磁盘是 SSD,因为它没有盘片旋转和读头移动,这会有所帮助吗?InputStream:available()

我之所以问这个问题,主要是因为我不知道 Java 或操作系统代码中发生了什么。

相关问题:有没有一种更省时的方法来做我想做的事情?

我在 Linux 6.x 上使用 Java 19.x。

Java 多线程 文件-IO

评论

1赞 Joachim Sauer 11/11/2023
检查引入了一个使用前读取的争用条件(即,当您“看到”5 个可用字节时,当您调用该数字时,该数字可能会更高或更低,具体取决于其他情况)。此外,一般来说,从多个线程读取单个文件几乎永远不会更快。最好只在单个线程中读取文件,然后从那里将要完成的工作分发到不同的线程上。available()read()
0赞 Basil Bourque 11/11/2023
现有的问题对你没有帮助吗?
0赞 Harry 11/11/2023
@JoachimSauer我应该提到每个阅读器线程都会打开自己的.在另一个过程中,无论如何,这都是必要的。我只是不确定多个读取器是否每个都有自己的实例会导致线程争用在 JVM 或操作系统级别导致不慢。FileInputStreamFileInputStream
2赞 Basil Bourque 11/11/2023
顺便说一句,Java 19 已经过了它的生命周期。始终使用最新版本或长期支持 (LTS) 版本之一:8、11、17、21。
1赞 Joachim Sauer 11/12/2023
所以你希望每个线程都读取整个创建的文件?我仍然会将其减少到单个,然后使用不那么繁重的进程中方法适当地分发数据,但至少这可以工作。

答: 暂无答案