java - 多线程读取Java文件

标签 java multithreading

我正在创建线程来读取 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();
    }
}

最佳答案

我想您认为像这样使用多个线程读取文件会比使用一个线程读取文件更快。这几乎肯定是错误的。线程在使用多个内核或处理器的 CPU 绑定(bind)任务上获得更好的性能。但文件读取不是 CPU 密集型任务。

操作系统使用磁盘 Controller 以磁盘接口(interface)的全带宽读取字节。对于几乎任何硬件组合,速度都受磁盘(读取和/或寻道时间)、其 Controller 及其 DMA 接口(interface)或总线的限制,而不是受 CPU 的限制。一个 CPU 很容易让磁盘 Controller 保持 100% 繁忙,甚至是不同磁盘的多个 Controller 。如果您需要证明这一点,请开始大文件复制并观察 CPU 利用率。不会很高。

因此,在您的多个线程中,一次只有一个会运行,从而增加了单线程计算的开销。

什么缓慢的文件传输是缓冲。为了获得灵 active ,i/o 库最终可以将每个字符缓冲 2 次甚至 3 次。

Java NIO 库旨在尽可能多地消除这种开销。参见示例 this article .类似的还有很多。我的经验是,精心编写的 NIO 阅读器将使用硬件的大部分可用性能。

有一个警告:如果您设置了重型病毒检查程序来扫描您正在阅读的文件类型,它可能会使阅读受到 CPU 限制。在这种不寻常的情况下,根据检查器架构,您可能会通过多线程获得提升。在这种情况下,您会找到总文件大小 S 并让线程 k=0,1,..,n-1 从偏移量 kS/n 读取到 (k+1)S/n - 1(通过 seek 调整到正确的偏移量并跟踪每个线程中读取的字节数)。然而,我仍然强烈怀疑额外的磁头寻道时间和随机访问的其他影响会抵消在多线程中运行病毒检查程序的任何优势。

关于java - 多线程读取Java文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971951/

相关文章:

java - 复制临时文件

java - hibernate "ON UPDATE CURRENT TIMESTAMP"列

c - pthread_mutex_lock 和 pthread_cond_wait/signal 导致死锁

python - 是否可以在类中线程化子类?

java - LayerUI仅在阻塞方法完成后才出现

java - 以字节数组形式上传到服务器的图像损坏(图像无法打开)

java - 比较BigDecimal值和double值等于两位小数

Java - 从多个多维数组创建 JSON 对象

multithreading - 当我使用 x86_64 CAS 指令时,仅锁定一个缓存行或完全锁定 L3 缓存?

c++ - 从 QThread 中运行的 C 代码显示 QMessageBox