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 émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    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

  2. #2
    Expert éminent
    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
    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 Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    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

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    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...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 émérite Avatar de Jidefix
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    742
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 742
    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?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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