java - 为什么多线程在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。与我的预期完全相反,因为所有线程都在不同的数组上工作并写入不同的文件。
解决方案
感谢大家的回答!我从他们身上学到了很多!我的代码中的问题是不应该存在的一行代码。goughy000 让我大开眼界,我不应该调用 appender.run() 方法,因为 thread.start() 调用了它。现在多线程时间下降到 1800-1900 毫秒。
推荐阅读
- sql-server - Extract all the characters after a position or index value in SQL Server
- bash - 无法连接时错过带有 cURL 的项目
- python - python cassandra 在生成器中获得 select * 的大结果(在 ram 中没有存储结果)
- laravel - 两个具有相同 OneSignal 应用 ID + Laravel 服务器的 Ionic 3 应用
- r - R 语言:在 SQL 语句中使用 UDF
- sql - PostgreSQL 查询基于字符串进行拆分并将它们连接到新的单独列中
- ios - tableView 在其父视图居中时不会出现
- php - 在 Woocommerce 中隐藏特定用户角色的特定运输方式
- oracle - Oracle SQL Developer 是否与 sqlnet.ora 一起使用?
- excel - 运行时错误 1004 - 复制所选工作表失败