Bonjour,
je suis actuellement en train d'essayer de timeouter une opération longue et je test donc le code suivant:
Qui, en théorie, devrait afficher dans la console environ 3 tics, en fonction du bon vouloir de la JVM.
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 import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class Test { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new Task()); try { System.out.println("Début"); System.out.println(future.get(3, TimeUnit.SECONDS)); System.out.println("Fin"); } catch (TimeoutException e) { future.cancel(true); System.out.println("Annulée"); } executor.shutdownNow(); } } class Task implements Callable<String> { //@Override public String call() throws Exception { int max=20; for(int i=0; i<max; i++){ System.out.println("Tic "+i); TimeUnit.SECONDS.sleep(1); } return "Task terminée"; } }
Or actuellement le résultat est prévisible mais bizarre: la boucle tourne systématiquement environ 2.5 fois plus longtemps que prévu:
Avec un timeout à 2 secondes, j'attends environ 5 secondes
Avec un timeout à 3 secondes, j'attends environ 8 secondes
Avec un timeout à 4 secondes, j'attends environ 11 secondes
Avec un timeout à 5 secondes, j'attends environ 13 secondes
Dans l'absolu je peux me contenter de mettre la moitié du timeout que je veux vraiment, de toute façon je ne suis pas à la seconde près. Mais j'aurai bien voulu comprendre un écart aussi important entre le temps attendu et le temps réel (qui est, je le rappelle, systématique et pas du tout aléatoire)
Jidéfix
Partager