IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

[Concurrent] Future.get: timeout trop long


Sujet :

Collection et Stream Java

  1. #1
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut [Concurrent] Future.get: timeout trop long
    Bonjour,
    je suis actuellement en train d'essayer de timeouter une opération longue et je test donc le code suivant:

    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";
        }
    }
    Qui, en théorie, devrait afficher dans la console environ 3 tics, en fonction du bon vouloir de la JVM.
    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
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Bizarre ton affaire... En plus je n'arrive pas à le reproduire.

    Tu tournes sous quelles version de Java ?
    Que te donne le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	System.out.println(System.getProperty("java.version"));
    	System.out.println(System.getProperty("java.runtime.version"));

    a++

  3. #3
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Quand tu fais un thread.sleep, tu arrêtes l'exécution du thread pendant AU MOINS le temps indiqué dans le timeout. Tu n'as aucune garantie que ça ne sera pas plus (au bon vouloir de la JVM justement).

    Si tu veux exactement une seconde entre chaque exécution, il faudra opter pour une autre approche
    Je ne suis pas mort, j'ai du travail !

  4. #4
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Eulbobo: je suis bien d'accord qu'on ne peut pas attendre une précision millisecondesque, mais la j'attends plus du double du temps demandé quand même! En plus le "sleep" marche bien, c'est juste le timeout qui est -très- en retard

    J'ai testé avec java 6 et 8:

    1.6.0_27
    1.6.0_27-b07
    et
    1.8.0_51
    1.8.0_51-b16

    Et j'ai le même comportement: le timeout n'intervient qu'au bout de neuf tours de boucles.
    Pour info je suis sous Windows XP
    Par contre je viens de tester sur java 6 (1.6.0_29-b11) sur un serveur Solaris 10, et j'ai bien le bon temps d'attente.

    Bref, ça vient de ma machine...
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Pour info, je viens tester ce code légèrement modifié sous seven
    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
    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 HelloWorld {
        public static void main(String[] args) throws Exception {
            ExecutorService executor = Executors.newSingleThreadExecutor();
            for (int time =2; time < 15; time++){
                System.out.println("timing: "+time);
                Future<String> future = executor.submit(new Task());
     
                try {
                    System.out.println("Debut "+new java.util.Date());
                    System.out.println(future.get(time, TimeUnit.SECONDS));
                    System.out.println("Fin "+new java.util.Date());
                } catch (TimeoutException e) {
                    //future.cancel(true);
                    System.out.println("Annulee "+new java.util.Date());
                }
                future.get(); //wait termination
                System.out.println("NEXT! ");
            }
            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 terminee";
        }
    }
    avec des java 7/8 32 et 64 bits et j'ai un comportement correct. Pareil via le site coding ground sous java 8

    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
    Tic 16                                                                                                                                                                                      
    Tic 17                                                                                                                                                                                      
    Tic 18                                                                                                                                                                                      
    Tic 19                                                                                                                                                                                      
    NEXT!                                                                                                                                                                                       
    timing: 13                                                                                                                                                                                  
    Tic 0                                                                                                                                                                                       
    Debut Tue Jul 21 13:37:05 UTC 2015                                                                                                                                                          
    Tic 1                                                                                                                                                                                       
    Tic 2                                                                                                                                                                                       
    Tic 3                                                                                                                                                                                       
    Tic 4                                                                                                                                                                                       
    Tic 5                                                                                                                                                                                       
    Tic 6                                                                                                                                                                                       
    Tic 7                                                                                                                                                                                       
    Tic 8                                                                                                                                                                                       
    Tic 9                                                                                                                                                                                       
    Tic 10                                                                                                                                                                                      
    Tic 11                                                                                                                                                                                      
    Tic 12                                                                                                                                                                                      
    Annulee Tue Jul 21 13:37:18 UTC 2015                                                                                                                                                        
    Tic 13                                                                                                                                                                                      
    Tic 14                                                                                                                                                                                      
    Tic 15                                                                                                                                                                                      
    Tic 16                                                                                                                                                                                      
    Tic 17                                                                                                                                                                                      
    Tic 18                                                                                                                                                                                      
    Tic 19                                                                                                                                                                                      
    NEXT!                                                                                                                                                                                       
    timing: 14                                                                                                                                                                                  
    Tic 0                                                                                                                                                                                       
    Debut Tue Jul 21 13:37:25 UTC 2015                                                                                                                                                          
    Tic 1                                                                                                                                                                                       
    Tic 2                                                                                                                                                                                       
    Tic 3                                                                                                                                                                                       
    Tic 4                                                                                                                                                                                       
    Tic 5                                                                                                                                                                                       
    Tic 6                                                                                                                                                                                       
    Tic 7                                                                                                                                                                                       
    Tic 8                                                                                                                                                                                       
    Tic 9                                                                                                                                                                                       
    Tic 10                                                                                                                                                                                      
    Tic 11                                                                                                                                                                                      
    Tic 12

  6. #6
    Membre éprouvé Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    Points : 1 154
    Points
    1 154
    Par défaut
    Bon j'ai fait un petit tour sur les postes autour de moi, et le résultat est assez clair: mes collègues qui ont le même type de poste que moi ont tous le même problème, les autres qui sont sur d'autres machines (plus récentes, autre OS...) fonctionnent tous normalement.

    Bref, le problème vient bien de ma machine. Ce ne serait pas le premier bug: un de mes collègues a son horloge qui compte les secondes trop vite! résultat elle avance de 2h toutes les 24h. Chez lui le timeout attend 17 secondes au lieu de 3 avant de se déclencher.

    La vérité est ailleurs... en tout cas ça ne vient pas de java. Peut être une défaillance de la pile de BIOS?
    Veuillez agréer nos sentiments les plus distingués. Soyez assurés de notre entière collaboration, bien à vous pour toujours et à jamais dans l'unique but de servir l'espérance de votre satisfaction, dis bonjour à ton père et à ta mère, bonne pétanque, mets ton écharpe fais froid dehors.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Jidefix Voir le message
    Ce ne serait pas le premier bug: un de mes collègues a son horloge qui compte les secondes trop vite! résultat elle avance de 2h toutes les 24h. Chez lui le timeout attend 17 secondes au lieu de 3 avant de se déclencher.

    La vérité est ailleurs... en tout cas ça ne vient pas de java. Peut être une défaillance de la pile de BIOS?
    Je dirais plutot des horloges pourries ou des machines bien verollées jusqu'à la moelle.

Discussions similaires

  1. Script, telnet et timeout trop long
    Par Chris1845 dans le forum Linux
    Réponses: 5
    Dernier message: 02/07/2009, 12h58
  2. probleme timeout rmi trop long
    Par esalagea dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2008, 16h50
  3. [Système] Traitement trop long, géré le timeout
    Par Oberown dans le forum Langage
    Réponses: 2
    Dernier message: 01/08/2006, 08h44
  4. [TComboBox] Contenu trop long pour la zone d'affichage
    Par bebeours dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/09/2003, 16h21
  5. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 18h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo