我正在创建线程来读取java中的文件。当我创建2个线程时,每个线程读取整个文件,而我希望它们读取文件的不同部分。我尝试放入sleep(),join(),yield()但是在包含它们之后它只会减慢读取速度。
public class MyClass implements Runnable {
Thread thread;
public MyClass(int numOfThreads) {
for(int i=0;i < numOfThreads; i++) {
thread = new Thread(this);
thread.start();
}
}
public void run() {
readFile();
}
}
在readFile中,在while循环中(逐行读取)我调用了sleep()/ yield()。如何让线程读取文件的不同部分?
更新了用于读取文件的方法......
public synchronized void readFile() {
try {
String str;
BufferedReader buf = new BufferedReader(new FileReader("read.txt");
while ((line = buf.readLine()) != null) {
String[] info = str.split(" ");
String first name = info[0];
String second name = info[1];
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
} catch (IOException e) {
System.out.println("Error : File not found");
e.printStackTrace();
}
}
答案 0 :(得分:16)
我认为你认为阅读具有多个这样的线程的文件比阅读一个文件更快。这几乎肯定是假的。线程使用多个内核或处理器在CPU绑定任务上获得更好的性能。但是文件读取不是CPU限制的任务。
操作系统使用磁盘控制器以磁盘接口的全带宽读取字节。对于几乎任何硬件组合,速度受磁盘(读取和/或寻道时间),其控制器以及DMA接口或总线的限制,而不受CPU的限制。 CPU很容易让磁盘控制器保持100%忙碌,甚至几个控制器也可以用于不同的磁盘。如果需要证明这一点,请启动大文件副本并观察CPU利用率。它不会很高。
因此,在多个线程中,一次只运行一个线程,为单线程计算增加了开销。
缓慢文件传输的内容是缓冲。为了获得灵活性,i / o库最终可以缓冲每个角色2次甚至3次。
Java NIO库旨在尽可能地消除这些开销。请参阅示例this article。有许多类似的。我的经验是,精心编写的NIO读卡器将使用硬件的大部分可用性能。
有一点需要注意:如果你有一个重型病毒检查程序设置扫描你正在阅读的文件类型,它可能会使读取CPU受限。在这种不寻常的情况下,根据检查器架构,您可能会通过多线程获得提升。在这种情况下,你会发现总文件大小为S,让线程k = 0,1,..,n-1从偏移量kS / n读取到(k + 1)S / n - 1({{1}转到正确的偏移量并跟踪每个线程中读取的字节数。但是我仍然强烈怀疑额外的磁头搜索时间和随机访问的其他影响将取消在多个线程中运行病毒检查程序的任何优势。
答案 1 :(得分:-1)
在你的程序中,string.split(&#34;&#34;)会导致运行速度变慢。自己写下来,它会将你的速度提高6倍。 这样的事情会有所帮助:
int index = vcf_record_string.indexOf("\t");
vcf_record_string.substring(0, index)
如果您的系统支持高吞吐量I / O,请按以下步骤操作: How to read a file using multiple threads in Java when a high throughput(3GB/s) file system is available