我寫了一個簡單的工具,它檢查內容的一些xml(解組和內容分析),併爲每個xml寫入一個日誌文件。FixedThreadPool線程數和運行時間
我必須檢查超過幾千個文件,大約2 MB /文件。所以進展需要一些時間。因爲我的文件之間沒有依賴關係,所以我嘗試在不同的線程中完成這項工作(沒有同步的方法)。
不幸的是,我的ExecutorService的東西似乎是錯的。我試圖使用一個fixedthreadpool Executorservice。但是具有1和100線程的運行時間幾乎是一樣的(以及CPU使用率)。只有在每個文件(files.size)使用1個線程的情況下,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'。 – hagrawal
當您僅使用一個線程運行時,該進程花費了多少時間進行計算以及花費了多少時間來執行I/O?您的計算機可能具有多個CPU,因此添加更多的線程可以使其計算速度更快(達到您擁有的CPU數量),但是如果所有這些文件都在同一個磁盤上......只有一個端口用於與磁盤交談。添加更多的線程根本不會改善I/O時間。 –