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 :

récupération d'une référence de Thread


Sujet :

Java

  1. #21
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    instance = this dans le run ... bof bof...

    un petit exemple avec les queues bloquantes :



    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
     
    public class USBThread {
    	//private static Logger log = Logger.getLogger(USBThread.class);
     
    	private final BlockingQueue <String> queue = new LinkedBlockingQueue<String>();
     
    	private static USBThread instance  = new USBThread();
    	private ComUSB usbCommunicator  = new ComUSB();
       // private ComUSB com = new ComUSB();
     
    	private USBThread(){
    		//log.debug("Construnction Thread USB singleton"+Thread.currentThread().getId());
    		System.out.println("Construnction Thread USB singleton ThreadID : "+Thread.currentThread().getId());
    		usbCommunicator.start();
    	}
     
        public static USBThread getInstance(){
        	//log.debug("Get Thread USB singleton"+Thread.currentThread().getId());
        	System.out.println("Get Thread USB singleton ThreadID : "+Thread.currentThread().getId());
        	return instance;
        }
     
        public void addMessageInQueue(String message){
        	//log.debug("addMessageInQueue : "+message);
        	System.out.println("addMessageInQueue : "+message);
        	queue.add(message);
        }
     
     
        class ComUSB extends Thread {
     
        	public void run() {
        		//log.debug("starting usbCommunicator Thread ");
        		System.out.println("starting usbCommunicator (customer) Thread ThreadID : "+Thread.currentThread().getId());
    	        try {
    				while(true) {
    					String message =  queue.take(); // enleve le premier element de la pile;
    					sendUSBMessage(message);
     
    				}
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				System.out.println(e);
    			}
        	}
     
        	private void sendUSBMessage(String message) {
        		//log.debug("processing message from Queue : "+message);
        		System.out.println("processing message from Queue : "+message);
        	}
        }
     
     
        public static void main(String args[]){
        	new MessageGenerator().start();
        	new MessageGenerator().start();
        	new MessageGenerator().start();
        	new MessageGenerator().start();
        }
     
    }
     
    class MessageGenerator extends Thread {
    	int cpt = 0;
    	int nbIterations = 10;
    	public void run() {
    		while(true && cpt<nbIterations) {
    			USBThread.getInstance().addMessageInQueue("test N° :" +cpt+" GeneratorID : "+Thread.currentThread().getId());
    			cpt++;
    		}
    	}
    }

    tu as un singleton (USBThread) accessible par getInstance.
    Ce singleton gère un consommateur de message 'ComUSB' qui ici affiche le message traité, à toi de l'adapter pour un envoi vers l'usb.

    Le consommateur reste en attente d'un message non traité (il se bloque), dès qu'il y en a un, il le traite.

    'MessageGenerator' simule un producteur de messages. Dans ton cas, ce sera ta servlet qui ajoutera des messages dans la pile via la méthode statique sur l'instance unique 'USBThread.getInstance()'
    Ici, j'en ai mis 4 et 10 messages par générateur.

    Si le "consommateur" ne va pas assez vite par rapport au producteur, les messages sont empilés et traités dès que possible, dans l'ordre premier arrivé, premier traité (FIFO).

    J'espère que ca t'aidera

    ++

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    ah oui effectivement c'est quand même plus propre et beaucoup mieux géré avec les queues bloquantes... je vais m'y pencher.

    Merci Spoutnik et Dinobogan, je passe en résolu la discussion,même si il me reste quelques doutes sur l'unicité du USBThread, mais je m'y colle en le faisant évoluer avec le ConccurentQueue.

    Tiamat.

  3. #23
    Membre émérite Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Par défaut
    même si il me reste quelques doutes sur l'unicité du USBThread, mais je m'y colle en le faisant évoluer avec le ConccurentQueue.
    histoire de t'enlever tout doute :
    http://christophej.developpez.com/tu...n/multithread/
    et en particulier :
    http://christophej.developpez.com/tu...ultithread/#L4
    (ici, je t'ai mis un initialiseur static)

    Bonne lecture

    ++

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 139
    Par défaut
    Je te remercie Spoutnik,

    j'ai bien pris en compte ton tuto, bien clair et très enrichissant !
    donc après quelques essais, tout marche bien et je n'ai bel et bien qu'une seul instance de mon Thread en mémoire.
    Je n'ai pour le moment pas rencontré de problèmes d'accès conccurentiel, mais au vu de mon archi, cela risque d'être très peu fréquent.

    Merci,
    Tiamat.

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

Discussions similaires

  1. Récupération d'une exception dérivée dans un thread
    Par Baccs dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 22/08/2008, 16h55
  2. [1.1] passer une référence dans un thread
    Par melleb dans le forum C#
    Réponses: 4
    Dernier message: 26/05/2008, 12h17
  3. Réponses: 4
    Dernier message: 11/06/2004, 17h27
  4. [C#] Récupération d'une image depuis une table SQL Server
    Par borgfabr dans le forum Accès aux données
    Réponses: 10
    Dernier message: 08/04/2004, 14h20
  5. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 12h08

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