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

Java Discussion :

[Thread] Executor et timeout


Sujet :

Java

  1. #21
    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 BiM Voir le message
    Bon j'ai pas tout compris sur la notion du interrupt().
    interrupt() met le flag isInterrupted() du thread à true et interrompt immédiatement toute opération bloquante, typiquement de type IO, réseau ou sleep le supportant (typiquement, toutes les méthodes lancant un interruptedException).

    quelle est la dif entre Thread et Runnable
    Runnable est juste une interface contenant une méthode run. Thread est une classe permettant la création d'un thread et qui, lors du démarrage de ce thread, lance la méthode run d'un Runnable qui lui a été passé ou de lui même.



    Les tâches ne sont pas lancées en parallèle, c'est important comme notion, si c'était le cas, tout échouerait.
    Alors pourquoi tu va t'emmerder avec un executorService au lieu de faire une simple boucle sur toutes tes tâches?
    Je voudrais que l'opération ne puisse pas être interrompue au milieu d'un fetch mais seulement avant ou après celui-ci.
    Ben tu met tes tests où tu veux hein Par contre si tu ne veux pas arrêter au milieu d'un fetch -> tu oublie le interrupt(), car typiquement il pourrais interrompre un IO réseau à l'intérrieur de JDBC! Tu met juste une méthode type isTooLate() dans le parent qui va te renvoyer true ou false suivant l'heure ^^ . Méthode que tu appelle sagement entre chaque opération courte. Bien sur, ça veux dire qu'en cas d'interruption réseau prolongée, de lock de la DB, etc, ta tâche pourrais dépasser les 2h juste parce qu'elle attends 30 minutes une réponde de la DB
    Dernière question, une fois qu'on a fait un shutdown sur l'Executor, est-il possible de le redémarrer ou il faut en instancier un tout beau tout neuf ?
    Faire un nouveau, mais le executor c'est pour du paralléllisme qu'on utilise ça. Si t'as pas de parallélisme -> tu oublie, ça sert à rien d'en mettre pour le plaisir d'en mettre. T'as typiquement un batch d'opération qui doit s'interrompre à un moment. Ben tu met tout ça en série dans une boucle avec un check régulire sur l'heure ^^

  2. #22
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Write lines one by one
    while (!Thread.currentThread().isInterrupted() && rs.next())
    {
            IOUtils.write(fetchResult(rs), outputStream);
    }
    Le shutdown du pool appellera interrupt sur chaque thread.

  3. #23
    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
    Citation Envoyé par tchize_ Voir le message
    Ben tu met tes tests où tu veux hein Par contre si tu ne veux pas arrêter au milieu d'un fetch -> tu oublie le interrupt(), car typiquement il pourrais interrompre un IO réseau à l'intérrieur de JDBC!
    Oui en effet je n'avais pas pensé à cela !

    Citation Envoyé par tchize_ Voir le message
    Tu met juste une méthode type isTooLate() dans le parent qui va te renvoyer true ou false suivant l'heure ^^ . Méthode que tu appelle sagement entre chaque opération courte.
    Et surtout sans oublier de mettre ce champ en "volatile"


    a++

  4. #24
    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 adiGuba Voir le message
    Oui en effet je n'avais pas pensé à cela !


    Et surtout sans oublier de mettre ce champ en "volatile"
    Pas besoin si la méthode calcule elle même le temps et qu'il n'y a pas d'autre thread

  5. #25
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Merci pour vos réponses, vous battez pas

    Ces éclaircissements m'aident beaucoup

    Citation Envoyé par tchize_ Voir le message
    Alors pourquoi tu va t'emmerder avec un executorService au lieu de faire une simple boucle sur toutes tes tâches?
    J'utilise un Executor parce que c'était un Executor à la base et que j'ai pas envie de tout casser mais j'utilise cet Executor : executors.newSingleThreadExecutor(), ce qui me permet de les mettre dans la file d'exécution mais qu'ils s’exécutent les uns après les autres.

    Voici à quoi ressemble mon Thread (Runnable plutôt), un truc très simple de test :
    Code Java : 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
    public class MyThread implements Runnable
    {
        private String _valeur;
     
        public MyThread(String valeur)
        {
            _valeur = valeur;
        }
     
        public String getValeur()
        {
            return _valeur;
        }
     
        @Override
        public void run()
        {
            try
            {
                System.out.println("Début " + _valeur);
                Thread.sleep(2000);
                System.out.println("Fin " + _valeur);
            }
            catch (InterruptedException e)
            {
                System.err.println("Erreur " + _valeur);
            }
        }
    }

    Je gère le executor comme suit :
    Code Java : 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
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(new MyThread("Anne"));
    executor.submit(new MyThread("Bertrand"));
    executor.submit(new MyThread("Camille"));
    executor.submit(new MyThread("Diane"));
    executor.submit(new MyThread("Eric"));
    executor.submit(new MyThread("Fabien"));
    executor.submit(new MyThread("Gertrude"));
    executor.submit(new MyThread("Hermione"));
    executor.submit(new MyThread("Isabelle"));
    executor.submit(new MyThread("Julien"));
     
    executor.shutdown();
    if (!executor.awaitTermination(11, TimeUnit.SECONDS))
    {
        System.out.println("Not finished");
        executor.shutdownNow();
    }
    else
    {
        System.out.println("Finished");
    }

    J'obtiens ça :
    Début Anne
    Fin Anne
    Début Bertrand
    Not finished
    Erreur Bertrand
    Donc lors du shutdownNow() qui est censé appelé les méthodes interrupt() des Thread en cours, le thread en question se prend un InterruptedException dans sa face Le thread ne continue donc pas son boulot tranquillement.

    Citation Envoyé par adiGuba Voir le message
    Juste une remarque : Perso je n'aime pas trop les try/catch/finally.
    Je préfère largement les try/finally englobé dans un try/catch. C'est plus propre (on n'ignore pas les exceptions de fermeture du flux).
    Vu le nombre de couches dans l'application, on va laisser comme ça, ça tourne très bien.

    Citation Envoyé par Deaf Voir le message
    Tu peux faire quelquechose comme cela:
    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
            ExecutorService executor = ...;
            Collection<Callable<Object>> tasks = ...;
     
            // Execute et attend la fin ou les 2 heures
            List<Future<Object>> futures = executor.invokeAll(tasks, 2, TimeUnit.HOURS);
     
            // Là, tout et fini ou les 2h se sont écoulées
            for (Future<Object> future : futures)
            {
                // On annule toutes les tâches non terminées, avec interruption si nécessaire
                if (!future.isDone())
                {
                    // La tâche ne sera pas lancée
                    future.cancel(true);
                }
            }
     
            // on achève l'executor pour libérer les resources
            executor.shutdown();
    Intéressant. Je vais tenter ce type de solution. Mais le problème des interrupt est toujours le même. Il s'avère que invokeAll correspond quand même carrément à mon besoin (j'en ai l'impression), merci

    Citation Envoyé par Deaf Voir le message
    Note: Je soupçonne la 2e partie de mon code d'être équivalente à un appel à shutdownNow().
    Après analyse du shutdown de l'Executor, il interrompt tous les Thread en cours par un interrupt().

    Citation Envoyé par tchize_ Voir le message
    interrupt() met le flag isInterrupted() du thread à true et interrompt immédiatement toute opération bloquante, typiquement de type IO, réseau ou sleep le supportant (typiquement, toutes les méthodes lancant un interruptedException).
    Ca doit être pour ça que j'ai une Exception ci-dessus, mais ça risque d'être pareil lors de l'écriture dans un fichier, non ?

    Citation Envoyé par balsoc Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Write lines one by one
    while (!Thread.currentThread().isInterrupted() && rs.next())
    {
            IOUtils.write(fetchResult(rs), outputStream);
    }
    Le shutdown du pool appellera interrupt sur chaque thread.
    C'est bien ce qui me semblait, mais bon toujours ce problème d'IO à priori.

  6. #26
    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 BiM Voir le message


    Ca doit être pour ça que j'ai une Exception ci-dessus, mais ça risque d'être pareil lors de l'écriture dans un fichier, non ?
    Ben oui, c'est le but de interrupt. Comme je l'ai dit, si tu veux pouvoir finir ta transaction DB, ta lecture ou cloturer ton fichier, l'interrupt n'est pas le bon choix. Du coup l'exécutor n'est plus le bon choix non plus

  7. #27
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Bon disons que c'est pas grave si je finis pas d'écrire ma ligne. Au pire, je me choppe un InterruptedException, et dans le finally, je ferme proprement le fichier (ou la connexion à la DB selon l'emplacement où je me trouve), c'est ça ?

  8. #28
    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
    ben oui, c'est toi qui disais que tu voulais terminer ton fetch.

  9. #29
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    ben oui, c'est toi qui disais que tu voulais terminer ton fetch.
    Oui mais au final je me rends compte qu'il y a trop de choses à modifier.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Stopper thread Executor Service
    Par flolebreton dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 25/04/2013, 11h53
  2. Indy Terminate Thread Timeout
    Par FredKaes dans le forum Web & réseau
    Réponses: 3
    Dernier message: 16/10/2007, 10h52
  3. [timer & thread] timeout & socket non bloquant
    Par untipy dans le forum Réseau
    Réponses: 33
    Dernier message: 22/08/2007, 08h37
  4. Timeout sur pool de threads
    Par ploxien dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 17/08/2007, 15h24
  5. [Stratégie] Gestion d'un timeout en environnement mono-thread
    Par loicdvi dans le forum Général Java
    Réponses: 2
    Dernier message: 14/05/2007, 09h07

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