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

Concurrence et multi-thread Java Discussion :

Timeout sur pool de threads


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut Timeout sur pool de threads
    Hello,

    Sur conseil d'un autre topic, j'ai fait un Timeout comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Timeout {
        private Timeout() {}  
        private static final ScheduledExecutorService TIMER = Executors.newSingleThreadScheduledExecutor(); 
        public static void timeout(final Future<String> source, long delay, TimeUnit unit) {  
            Runnable cancel = new Runnable() {  
                public void run() {  
                    source.cancel(true); 
                }  
            }; 
            TIMER.schedule(cancel, delay, unit); 
        }
    }
    Pour gérer les timeout sur un pool de threads. Cela fonctionne bien tant que le pool n'est pas plein, par exemple comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            Executor executor = Executors.newFixedThreadPool(2);
            CompletionService<String> completionService =
                new ExecutorCompletionService<String>( executor );
     
            Future<String> resultTemp = null;
            for(int i=0;i<2;i++){
                resultTemp = completionService.submit( new Th1(text+i) );
                Timeout.timeout(resultTemp, 3000L, TimeUnit.MILLISECONDS);
            }
     
            ...
    Mais, si, par exemple je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Executor executor = Executors.newFixedThreadPool(2);
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Executor executor = Executors.newFixedThreadPool(1);
    Le problème est que le timeout part du moment ou le thread est mis en queue et non du moment ou il est lancé... Ainsi, si le premier prends pas mal de temps, le timeout du premier est déjà terminé avant même qu'il n'ait commancé!!

    Comment je peux résoudre cela?

    Merci d'avance.

    A+

  2. #2
    Membre éclairé Avatar de ploxien
    Inscrit en
    Février 2006
    Messages
    467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Février 2006
    Messages : 467
    Par défaut
    Solution, si cela intérese qqn

    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
     
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
     
    import com.nexthink.portal.lua.LuaTable;
     
    public class Timeout {
        public Timeout(long delay){
            this.delay = delay;
        }  
     
        private Future<LuaTable> source = null;
        private long delay = 0;
     
        private final ScheduledExecutorService TIMER = Executors.newSingleThreadScheduledExecutor(); 
     
        public void startTimeout() {
            Runnable cancel = new Runnable() {  
                public void run() {  
                    source.cancel(true); 
                }  
            }; 
            TIMER.schedule(cancel, delay, TimeUnit.MILLISECONDS); 
        }
     
        public synchronized Future<LuaTable> getSource() {
            while(source == null){
                try {
                    wait();
                } catch (InterruptedException e) {}
            }
            return source;
        }
     
        public synchronized void setSource(Future<LuaTable> source) {
            notify();
            this.source = source;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Timeout timeoutForThisThread = new Timeout((long)timeoutForOneThread);
    temp = completionService.submit(new <Thread>);
    timeoutForThisThread.setSource(temp);
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pool de thread et timeout
    Par nretrain dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 21/07/2011, 15h01
  2. Tutoriel sur les pool de threads
    Par ploxien dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 09/08/2007, 13h14
  3. [XPATH] Erreur XPath sur du multi-thread
    Par pvoncken dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 08/02/2006, 15h19
  4. Réponses: 3
    Dernier message: 22/11/2005, 19h23
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 17h22

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