FixedThreadPool threadcount和runtime

时间:2017-05-24 13:11:44

标签: java multithreading executorservice

我写了一个简单的工具,它检查内容的一些xmls(解组和内容分析),并为每个xml写一个日志文件。

我必须检查超过数千个文件,大约2 MB /文件。所以进步需要一些时间。因为我的文件之间没有依赖关系,所以我尝试在不同的线程中完成工作(没有同步的方法)。

不幸的是,我的ExecutorService出现了一些错误。我试图使用fixedthreadpool 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();
    }


}

}

2 个答案:

答案 0 :(得分:0)

我认为没有关系,也没有关系。这取决于线程正在做的工作。具有一个线程的程序可以占用100%的CPU,而具有大量线程的程序可以消耗更少的。

如果您正在寻找线程和完成工作之间的优化关系,您必须研究您的案例,并可能找到一个经验解决方案。

答案 1 :(得分:0)

感谢您的回复。

正如@hagrawal所写,使用1,10或100个线程没有区别。就像我使用尽可能多的线程而不是我的列表中的文件一样,我有更多的CPU使用率(直到CPU成为瓶颈)并且整个进度需要大约10%的时间。不幸的是,这需要大量内存,我担心,它将导致软件崩溃,将来会有更多文件。

我无法想象,这可能是一个I / O问题。我的机器的raid 0系统应该能够毫不费力地做到这一点。如果我对问题的理解是正确的,那就不是I / O问题。因为如果I / O是瓶颈,如果线程数等于文件数(在我的情况下大约为1000),性能不应该增加。或者我的薄荷有什么不对吗?

不幸的是,CPU使用率与1,10和100个线程几乎不相同。所以我的印象是,进度从固定数量的线程(如配置)开始,执行器服务在开始新线程之前等待所有线程终止。但我的理解是,只要第一个终止并免费,它就会启动一个新线程?