gpt4 book ai didi

java - 一个额外的线程极大地提高了性能

转载 作者:行者123 更新时间:2023-12-02 13:37:02 24 4
gpt4 key购买 nike

有几个问题,例如 herehere ,询问为什么额外的线程会降低性能。我明白了。

我有一个有点相反的问题:仅仅一个额外的线程如何能够将性能提高一个因子,例如10 甚至 20?

示例代码:

           public class MainThreaded {

public static void main(String[]

String filePath = "my\\path\\";

String[] inFiles = {filePath+"file1.txt",filePath+"file2.txt"};
String[] outFiles = {filePath + "file1Out.txt", filePath + "file2Out.txt"};

long startTime = System.currentTimeMillis();

for (int i = 0; i < inFiles.length; i++) {

Adder adder = new Adder(inFiles[i], outFiles[i]);
// adder.doAdd();
Thread thread = new Thread(adder);
thread.start();
}

long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("That took " + totalTime+ " milliseconds");


}

}



public class MainNoThread {

public static void main(String[] args) {


String filePath = "my\\path\\";
String[] inFiles = {filePath+"file1.txt",filePath+"file2.txt"};
String[] outFiles = {filePath + "file1Out.txt", filePath + "file2Out.txt"};

long startTime = System.currentTimeMillis();

for (int i = 0; i < inFiles.length; i++) {

Adder adder = new Adder(inFiles[i], outFiles[i]);
try {
adder.doAdd();
} catch (IOException e) {
e.printStackTrace();
}

}

long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("That took " + totalTime+ " milliseconds");

}

}

public class Adder implements Runnable {

private String inFile, outFile;

public Adder(String inFile, String outFile){
this.inFile = inFile;
this.outFile = outFile;

}

public void doAdd() throws IOException{

int lines = 0;

try(BufferedReader reader = Files.newBufferedReader(Paths.get(inFile))){
while (reader.readLine() != null) {
lines++;
}
try(BufferedWriter writer = Files.newBufferedWriter(Paths.get(outFile))){
writer.write("Total: " + lines);
}
}

}

@Override
public void run() {

try {
doAdd();
} catch (IOException e) {
e.printStackTrace();
}

}
}
  • 第一个没有线程的应用程序需要大约。 40 毫秒
  • 第二个版本,仅创建一个额外的 new Thread() 需要 2 毫秒。

所以我的问题:如此巨大的进步背后的原因是什么?

最佳答案

当您调用 thread.start() 时,您的代码不会等待线程完成其工作后再继续。 start() 是所谓的“非阻塞”或“异步”方法。

为了准确计时,您需要以某种方式等待线程完成,然后再测量所用的时间。一种方法是跟踪您创建的所有线程,然后在将它们全部关闭后,在最后为每个线程调用“thread.join()”。 Thread.join() 将阻塞(等待)线程完成,然后再继续。

关于java - 一个额外的线程极大地提高了性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42934554/

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