首页 > 解决方案 > 为什么多线程在java中写入文件时速度较慢

问题描述

我是多线程新手,今天我尝试在相同条件下运行一些多线程与单线程程序的性能测试。令我惊讶的是,我发现单线程选项的工作速度比多线程选项要快一些。那么可能是什么原因呢?

我编写了一个带有字符串连接类的简单程序,该程序将结果写入文件。我创建了 5 个包含 50000 个零的数组和 5 个输出文件,它们在 for 循环中传递给 Appender 类的构造函数。在多线程选项中,我调用 appender.run(),在单线程选项中,我注释掉所有与线程相关的行并改为调用 appender.appendString();

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        int[][] input = {new int[50000], new int[50000], new int[50000], new int[50000], new int[50000]};

        File[] outputFiles = {new File("src\\text6.txt"), new File("src\\text7.txt"), new File("src\\text8.txt"),
                new File("src\\text9.txt"), new File("src\\text10.txt")};

        long startTime = System.currentTimeMillis();
        Thread[] threads = new Thread[5];
        for (int i = 0; i < 5; i++) {
            Appender appender = new Appender(input[i], outputFiles[i]);
            threads[i] = new Thread(appender);
            threads[i].start();
            appender.run();
        }

        for (Thread thread : threads) {
            thread.join();
        }
        long stopTime = System.currentTimeMillis();

        System.out.println(stopTime - startTime);
    }
}

class Appender implements Runnable {

    private String result;
    private int[] input;
    private File outputFile;

    public Appender(int[] input, File outputFile) {
        this.result = "";
        this.input = input;
        this.outputFile = outputFile;
    }

    public void appendString() {
        for (int number : input) {
            this.result += String.valueOf(number);
        }

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(this.outputFile));) {
            writer.write(this.result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        appendString();
    }
}

测量的执行时间(以毫秒为单位)适用于多线程大约 3600-3700 和单线程 2800-2900。与我的预期完全相反,因为所有线程都在不同的数组上工作并写入不同的文件。

标签: javamultithreadingperformance

解决方案


感谢大家的回答!我从他们身上学到了很多!我的代码中的问题是不应该存在的一行代码。goughy000 让我大开眼界,我不应该调用 appender.run() 方法,因为 thread.start() 调用了它。现在多线程时间下降到 1800-1900 毫秒。


推荐阅读