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 :

Question sur les threads et bytebuffers


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 58
    Points : 39
    Points
    39
    Par défaut Question sur les threads et bytebuffers
    Bonjour à tous,
    D'après ce que j'ai compris sur les thread,ce qu'ils permettent de faire le multitâche donc du coup pour moi pour q'un thread puisse fonctionner il doit en exister d'autres afin qu'il ait communication.Mais ce que je n'arrive pas à comprendre ce que ce code fonctionne pourtant il n'y a qu'un thread(listener) :

    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
    public static void main(String[] args) throws IOException, InterruptedException {
    
    	private final BlockingQueue<ByteBuffer> queue = new ArrayBlockingQueue<ByteBuffer>(1);
    	private DatagramChannel dc;
    
            dc=DatagramChannel.open();
            dc.bind(null);
    
            private final Thread listener = new Thread(() -> {
    		ByteBuffer bufferReceive = ByteBuffer.allocate(BUFFER_SIZE);
    		while (!Thread.interrupted()) {
    			try {
    				bufferReceive.clear();
    				receive(bufferReceive);
    
                                     /*svp pourquoi si je fais 
                                      *bufferReceive.flip();
                                      *queue.put(bufferReceive);
                                      *ça ne marche pas?j'ai une erreur de type ByteBufferUnderFlowException.
                                      */
    				queue.put(bufferReceive.duplicate());//et ici quelqu'un peut m'expliquer svp pourquoi ça marche avec duplicate()? et quel est l'intérêt?
                                  
    
    			} catch (IOException e) {
    				e.printStackTrace();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	});
    	listener.start();
    
          ByteBuffer bufferToSend = createPacket(requestNumber, s, cs);
          bufferToSend.flip();
          send(bufferToSend);
    
          ByteBuffer bufferResponse = ByteBuffer.allocate(BUFFER_SIZE);
          bufferResponse = queue.poll(TIMEOUT, TimeUnit.MILLISECONDS);
    }
    De plus j'aimerai savoir la différence entre les 2 méthodes ci-dessous de sleep d'un thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Thread ts = new Thread(new Runnable() {
    			@Override
    			public void run() {
    				while (!Thread.interrupted()) {
    				        Thread.sleep(TIMEOUT);
    			}
    		});
    ts.sleep(TIMEOUT);
    Merci d'avance!!!

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 325
    Points : 3 768
    Points
    3 768
    Billets dans le blog
    12
    Par défaut
    Salut,

    Je ne comprends pas ta première question, les bytebuffers et threads sont deux concepts différents. C'est comme essayer d'expliquer la différence entre un papillon et un immeuble.
    Pour ce qui est de ta deuxième question il n'y a pas de différence car c'est la même méthode (lien Javadoc).

    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Points : 140
    Points
    140
    Par défaut
    Bonjour,
    Pour la première question, il y a plus d'un thread dans l'extrait de code : il y a le thread listener, mais il y a aussi le thread exécutant la méthode main. Tout programme a au minimum 1 thread !
    Pour la deuxième question, il faut noter que la méthode demande que le thread en cours d'exécution stoppe son exécution durant le temps passé en paramètre.
    Si l'appel dans la boucle permet d'éviter que le thread ts fasse de l'attente active, l'autre appel est trompeur car il stoppe l'exécution, non pas du thread ts, mais du thread qui a créé le thread ts puisque c'est lui qui est en cours d'exécution.
    D'ailleurs, le compilateur doit certainement produire un avertissement sur cette ligne car c'est une mauvaise pratique d'appeler une méthode statique via un objet.

Discussions similaires

  1. Question sur les threads
    Par thebloodyman dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 22/01/2007, 08h28
  2. Questions sur les threads: généralités
    Par Gragra dans le forum C++
    Réponses: 9
    Dernier message: 04/11/2006, 17h28
  3. Quelques questions sur les threads
    Par benj63 dans le forum C++Builder
    Réponses: 28
    Dernier message: 21/11/2005, 14h27
  4. Question sur les threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 21/10/2005, 10h08
  5. Question sur les threads
    Par nicolas66 dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 21h57

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