J'ai écrit un outil simple qui vérifie certains xml (unmarshalling et analyses de contenu) pour le contenu et écrit un fichier journal par xml.FixedThreadPool threadcount et runtime
Je dois vérifier plus de mille fichiers avec environ 2 Mo/fichier. Donc, le progrès prend du temps. Parce qu'il n'y a pas de dépendances entre mes fichiers, j'ai essayé de faire le travail dans différents threads (pas de méthodes synchronisées).
Malheureusement quelque chose avec mon ExecutorService semble être faux. J'ai essayé d'utiliser un Executorservice fixedthreadpool. Mais l'exécution avec 1 et 100 threads est à peine la même (ainsi que l'utilisation du processeur). Seulement si j'utilise 1 Thread par fichier (files.size) l'utilisation du processeur est beaucoup plus élevée (environ 90%) et le temps d'exécution est d'environ 10% de l'exécution d'origine.
Je ne comprends pas pourquoi l'utilisation de runtime et cpu avec 1 thread est la même qu'avec 100 threads.
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();
}
}
}
Vous ne pouvez pas trouver de différence lorsque vous spécifiez 'max.threadcount' comme 1 et lorsque vous spécifiez cela comme 100? Et pouvez-vous fournir un code minimal reproductible parce qu'en regardant ce code, je pense que vous devriez obtenir X nombre de threads de traitement en parallèle où X = 'max.threadcount'. – hagrawal
Lorsque vous exécutez avec un seul thread, combien de temps le processus passe-t-il à faire du calcul et combien de temps consacre-t-il à faire des E/S? Votre ordinateur a probablement plus d'un processeur, donc ajouter plus de threads lui permet de calculer plus rapidement (jusqu'au nombre de CPU que vous avez), mais si tous ces fichiers sont sur le même disque ... Il n'y a qu'un seul port pour parler au disque. Ajouter plus de threads n'améliorera en rien le temps d'E/S. –