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 :

[Java 1.5] Question facile java.util.concurrent package


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    377
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 377
    Points : 356
    Points
    356
    Par défaut [Java 1.5] Question facile java.util.concurrent package
    Bonjour,

    J'aimerai savoir si quelqu'un a déjà utilisé ce package, et si oui, j'aimerai savoir si les locks sont gérés automatiquement par l'objet, où si je dois faire quelquechose.
    Je cherche également une liste qui me permette de faire du FIFO, et que je dépile.
    En gros, mon besoin est le suivant, j'ai une classe, dont j'aimerai avoir des méthodes static permettant d'ajouter des messages, et que celle ci soit également un Thread, qui dépile au fur et à mesure.
    Vous pouvez me donner un coup de pouce avec ce nouveau package, je pense que c'est le bon !!
    Merci à tous.

  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,


    C'est bien le package qu'il te faut !
    Et en particulier l'interface BlockingQueue qui permet de gérer des queues bloquantes (ou non).

    Ses implémentations sont thread-safe et tu n'a donc pas à manipuler des lock ou des synchronized

    Il te suffit donc de les utiliser comme une simple collections, en utilisant les méthodes les plus adapté selon tes besoins, par exemple take() permet de récupérer un élément en le supprimant de la queue, et bloquera tant que la queue est vide, tandis-que poll() te renverra directement null dans ce cas...


    Par exemple dans ton cas ton thread pourrait ressembler à ceci :
    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
    45
    46
    abstract class MyTask<E> extends Thread {
     
    	/** Queue qui stockera les données avant le traitement */
    	private final BlockingQueue<E> queue = new LinkedBlockingQueue<E>();
     
     
    	/**
             * "Envoi" les données au thread.
             * En fait lles données sont passé à la Queue qui sera ensuite lu par le thread
             * @param str
             */
    	public final void send(E...args) {
    		// On ajoute tout les éléments un à un :
    		for (E data : args) {
    			this.queue.offer(data);
    		}
    	}
     
     
    	/**
             * Méthode qui traitera les données reçus.
             * @param data
             */
    	public abstract void received(E data);
     
     
    	/**
             * Traitement du thread
             * On récupère les éléments de la queue et on les traite
             */
    	public void run() {
     
    		try {
    			E current;
    			// take() permet de récupérer le premier element de la queue
    			// en bloquant le thread courant tant que la liste est vide...
    			while ( !isInterrupted() && (current=this.queue.take()) != null) {
     
    				// On appelle la méthode qui traitera les données :
    				received(current);
     
    			}
    		} catch (InterruptedException e) { /* condition de fin */ }
    		System.out.println("FIN DU THREAD");
    	}
    }
    Exemple :
    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
    	public static void main(String[] args) throws Exception {
     
    		// On crée un nouveau Thread qui utilisera des String :
    		MyTask<String> task = new MyTask<String>() {
    			@Override
    			public void received(String data) {
    				System.out.println("Received : [" + data + "]");
    			}
    		};
    		task.start(); // on démarre le thread
     
    		task.send("Hello !", "World !");
     
    		Thread.sleep(2000);
     
    		task.send("Bye Bye");
    		task.interrupt();
    	}
    Ce qui donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Received : [Hello !]
    Received : [World !]
    Received : [Bye Bye]
    FIN DU THREAD
    a++

  3. #3
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    377
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 377
    Points : 356
    Points
    356
    Par défaut
    Cool !!!!
    Trop classe !
    Et encore merci pour l'exemple !!
    A charge de revanche .

Discussions similaires

  1. Class AbstractQueuedSynchronizer (java.util.concurrent.locks)
    Par flow_13 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 01/06/2010, 15h23
  2. Questions sur java.util.logging
    Par samsam786 dans le forum Logging
    Réponses: 2
    Dernier message: 02/04/2010, 09h50
  3. Question facile java
    Par Mchupakabra dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/04/2008, 15h26
  4. Aide java script diver questions
    Par Argorate dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 05/08/2006, 03h32
  5. [java 1.5]java.util.concurrent
    Par afrikha dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 29/03/2006, 19h12

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