gpt4 book ai didi

java - 从多个线程写入多个文本文件

转载 作者:行者123 更新时间:2023-12-01 12:58:15 26 4
gpt4 key购买 nike

我正在做一些关于多线程的实验。

当程序运行到输出部分时,(使用java.io.FileWriter)有时它可以很快地通过,但有时它只是卡在那里。

FileWriter的问题吗?这是简化的代码:

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

public class Test extends Thread {
private int _id;

public Test(int id) {
_id = id;
}

@Override
public void run() {
long start = System.currentTimeMillis();

for (int i = 0; i < 10000; i++) {
try (FileWriter fw = new FileWriter(new File(_id + ".txt"))) {
fw.write("hello!");
} catch (IOException e) {
System.err.println("Something wrong.");
}
}

System.out.println(_id + ": " + (System.currentTimeMillis() - start));
}

public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Test(i).start();
}
}
}

这是我的结果:

7: 38209: 38782: 39658: 39560: 40586: 40975: 41113: 42591: 43544: 4369
9: 47037: 47485: 48912: 49944: 50653: 56721: 58040: 58058: 59256: 6042
1: 44959: 52656: 55512: 56515: 56768: 56973: 59170: 60017: 60024: 6314

我运行了三次,为什么运行时间不同?是FileWriter的问题还是文件系统的问题?

最佳答案

您至少有两个问题:

  • 你进行了太多的系统调用;基本上,对于每个线程的一个循环,您执行 open()write()、(也许 flush()),最后 close ();至少 30 万个系统调用!
  • 您创建了 100k 个 FileWriter 对象、100k 个 File 对象; gc 需要处理所有这些;由于 gc 本身在一个线程中运行,并且像任何其他线程一样进行调度,因此它会或多或少地运行。

因此,问题更多地出在您的程序上,而不是与操作系统相关的任何问题...... JIT 在这里无法为您做任何事情。

此外,由于您使用 Java 7,因此应该考虑使用 Files.newBufferedWriter() ——每个线程仅使用一次,当然,不是 10000 次!

<小时/>

关于“系统调用问题”的进一步说明:至少在 Unix 系统上是这样,但其他操作系统可能也同样工作,每次您进行系统调用时,您的进程都必须进入内核模式系统调用被执行;这不是免费的。即使在现代系统上成本不是那么高,它仍然比不需要执行用户->内核->用户要高得多。

<小时/>

好吧,我撒了一点谎; JIT 确实会发挥作用,但它只会优化用户方面的事情。 JIT 将在方法(此处为 run())执行 10k 次后开始优化,并随着时间的推移优化更多。

关于java - 从多个线程写入多个文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23721778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com