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
++






Répondre avec citation




Partager