【发布时间】:2017-05-24 13:11:44
【问题描述】:
我编写了一个简单的工具,它检查一些 xml(解组和内容分析)的内容并为每个 xml 编写一个日志文件。
我必须检查大约 2 MB / 文件的一千多个文件。所以进步需要一些时间。因为我的文件之间没有依赖关系,所以我尝试在不同的线程中完成工作(没有同步方法)。
不幸的是,我的 ExecutorService 似乎有问题。我尝试使用固定线程池 Executorservice。但是具有 1 个和 100 个线程的运行时几乎不一样(以及 cpu 使用率)。只有当我每个文件使用 1 个线程(files.size)时,cpu 使用率才会高得多(大约 90%),并且运行时大约是原始运行时的 10%。
我不明白为什么 1 个线程的运行时和 cpu 使用率与 100 个线程相同。
package mycode;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Starter {
public static void main(String[] args) {
File config = new File(args[0]);
Starter starter = new Starter();
starter.work(config);
}
private void work(File config)
{
Long start = System.currentTimeMillis();
ConfigReader cr = new ConfigReader(config);
cr.init();
FileFinder ff = new FileFinder();
List<File>files = ff.findfiles(cr.getParam("xmlfolder"));
List<String>done = new ArrayList<String>();
ExecutorService es = Executors.newFixedThreadPool(Integer.parseInt(cr.getParam("max.threadcount")));
for (File aktuell : files)
{
es.execute(new Threadstarter(aktuell, cr.getParam("logoutput"), done));
}
es.shutdown();
try {
es.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Long end = System.currentTimeMillis();
BufferedWriter logwriter;
try {
logwriter = new BufferedWriter(new FileWriter(new File(cr.getParam("logoutput")).getAbsolutePath()+"/log.log"));
for (String temp : done)
{
logwriter.write(temp);
logwriter.newLine();
}
logwriter.write("Die Verarbeitung dauerte "+(end-start)/1000 +" Sekunden");
logwriter.newLine();
logwriter.write("Es wurden "+files.size()+" Dienststellen verarbeitet");
logwriter.flush();
logwriter.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
【问题讨论】:
-
当您将
max.threadcount指定为 1 和将其指定为 100 时,您无法找到差异?您能否提供一个最小的可重现代码,因为查看此代码我认为您应该获得 X 个并行处理线程,其中 X =max.threadcount。 -
当你只用一个线程运行时,进程花费多少时间进行计算,花费多少时间进行I/O?您的计算机可能有多个 CPU,因此添加更多线程可以使其计算速度更快(最多可达到您拥有的 CPU 数量),但如果所有这些文件都在同一个磁盘上......只有一个端口用于与磁盘交谈。添加更多线程根本不会改善 I/O 时间。
标签: java multithreading executorservice