【发布时间】:2014-10-18 13:33:40
【问题描述】:
我想用 10 个线程定义线程池并读取文件的内容。但是不同的线程不能读取相同的内容。(比如将内容分成10块,每块一个线程读取)
【问题讨论】:
标签: java multithreading threadpool
我想用 10 个线程定义线程池并读取文件的内容。但是不同的线程不能读取相同的内容。(比如将内容分成10块,每块一个线程读取)
【问题讨论】:
标签: java multithreading threadpool
那么你会做的大致是这样的:
(file_size / N) * thread_no 并将(file_size / N) 字节读入缓冲区(如果你稍微聪明一点,你可以避免最后一步......)
但是,这样做是否会大大加快您的速度是值得怀疑的。事实上,如果你在很多情况下都放慢了速度,我不会感到惊讶。对于典型的操作系统,我希望通过使用来自一个线程的一个大的read(...) 调用来读取文件,即使不是更好的性能,您也会获得同样好的性能。
如果您按顺序读取,操作系统可以更快地从光盘中获取数据。事实上,许多操作系统都针对这种用例进行了优化,并使用预读和内存缓冲(使用操作系统级缓冲区)来提供高效的文件读取率。
使用多个线程读取文件意味着每个线程通常会从文件中的不同位置读取。天真地,这将需要操作系统在不同位置之间来回寻找磁盘头......这将大大减慢 I/O。实际上,操作系统会采取各种措施来缓解这种情况,但即便如此,同时从磁盘上的不同位置读取数据仍然不利于 I/O 吞吐量。
【讨论】: