Bonjour,
Je developpe actuellement un chrono en Java qui doit permettre de faire remonter a l'utilisateur le temps CPU utilise par un thread et j'ai comme un probleme.
Mon chrono doit calculer le temps CPU utilise par un thread. Java possede des outils pour faire ca, il s'agit d'objets lies interface ThreadMXBean. Mais voici le code qui pose probleme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public class Test { public Test() {} public class A extends Thread { public void run() { Random g1 = new Random(); for(int i = 0; i < 1.0E8; i++) { g1.nextDouble(); } System.out.println(getClass() + " id : " + Thread.currentThread().getId() + " time : " + ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()/1.0E9)); } } public class B extends Thread { public void run() { Random g1 = new Random(); for(int i = 0; i < 1.0E8; i++) { g1.nextDouble(); } System.out.println(getClass() + " id : " + Thread.currentThread().getId() + " time : " + (ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()/1.0E9)); } } public void runOn() { AbstractChrono chronoCpu = new GlobalCPUTimeChrono(); AbstractChrono chronoSys = new SystemTimeChrono(); chronoSys.init(); chronoCpu.init(); A a = new A(); B b = new B(); a.start(); b.start(); try { a.join(); b.join(); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("GlobalTime : " + chronoCpu.format()); System.out.println("SystemTime : " + chronoSys.format()); } public static void main (String[] args) { Test c = new Test(); c.runOn(); } }
Ici je cree des objects de deux classes qui sont des Threads que je fais tourner dans le vide (je genere des nombres dans le vide) et a qui je demande d'afficher leur temps d'execution quand il ont fini. L'objet chronoCpu renvoie le tems d'execution de la machine viruelle, et chronoSys renvoie le temps systeme qu'a dure l'execution, ces deux chronos marchent bien soint testes, valides et tout et tout, la fonction format affiche les temps de maniere bien jolie.
Voici le resultat que j'obtiens a l'execution :
Le probleme est que la somme des deux temps CPU des threads ne devrait pas etre superieure au temps CPU de la JVM et encore moins au temps systeme donc y a une couille dans le potage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 class Test$A id : 9 time : 2.53 class Test$B id : 10 time : 2.6 GlobalTime : 0:0:2.61 SystemTime : 0:0:2.62
Bon alors je comprend peut-etre pas bien comment fonctionne le ThreadMXBean et a priori mon probleme vient de la.
Partager