Vous êtes sur la page 1sur 9

Passage de messages Synchrone

Channel

10
Concepts de base (1/3)
 Bloquant Bloquant : l'émetteur et le récepteur sont bloquées jusqu'à ce
que le message est délivré.
 La communication ne peut être effective que lorsque le processus émetteur
est prêt à effectuer l'opération envoyer et que le récepteur est prêt à
recevoir une information.

11
Concepts de base (2/3)

12
Concepts de base (3/3)
 La notion de « Channel »

 c .send(e) - send the  v = c .receive() - receive a


value of the expression e to value into local variable v from
channel c. The process calling the channel c. The process calling the
send operation is blocked until receive operation is blocked
the message is received from the waiting until a message is sent to
channel. the channel.

13 cf. distributed assignment v=e


Passage de messages Synchrone en Java

 Java ne contient pas de primitives intégrées pour le passage des


messages synchrone
 Utilisation de la classe Java SynchronousQueue
 Les processus tournent sur une même machine!

14
Passage de messages Synchrone en Java
La classe SynchronousQueue<T>

Sender SynchronousQueue<T> q
Receiver
q.put(e) v=q.take()
one-to-one

 q .put(e) - send the value  v = q .take() - receive a


of the expression e to the queue q. value into local variable v from
The process calling the put queue q. The process calling the
operation is blocked until the take operation is blocked waiting
message is received from the until a message is sent to the
queue. channel.
The queue capacity = 0
15
Passage de messages Synchrone en Java
La classe SynchronousQueue<T>
 c.put(e); RQ, il faut ajouter try/catch
 v = c.take(); RQ, il faut ajouter try catch
class Sender extends Thread{ class Receiver extends Thread{
SynchronousQueue <Integer> c SynchronousQueue <Integer> c;
Sender(SynchronousQueue <Integer> chan) Receiver(SynchronousQueue <Integer> chan)
{c=chan;} {c=chan;}
public void run(){ public void run(){
int e = 0; Integer v=null;
try{c.put(new Integer(e)); } try{v = c.take(); }
{catch(..){}} {catch(..){}}

public static void main (String args[]){


SynchronousQueue <Integer> c = new SynchronousQueue <Integer>();
Sender s = new Sender (c);
Receiver r = new Receiver (c);
s.start(); r.start();
16 }
Exercice 1

Le processus Copy répète l’émission des caractères reçus du processus West à


un autre processus East

Hello Hello
West Copy East

17
Solution
class Copy extends Thread{ class West extends Thread{ class East extends Thread{
SynchronousQueue<String> chan1 SynchronousQueue<String> chan SynchronousQueue<String> chan
SynchronousQueue<String> chan2 West(SynchronousQueue<String> c){ East(SynchronousQueue<String> c){
Copy(SynchronousQueue<String> c1, chan=c;} chan=c;}
SynchronousQueue<String> c2){ public void run(){ public void run(){
chan1=c1; chan2=c2;} while (true) while (true)
public void run(){ chan.put(new String ( String v= Null;
while (true){ “Hello“)); v=chan1.take()
String v= Null; }} }}
v=chan1.take();
chan2.put(v); }}}

public static void main (String args[]){


SynchronousQueue <String> chan1 = new SynchronousQueue <String>();
SynchronousQueue <String> chan2 = new SynchronousQueue <String>();
Copy c = new Copy(chan1, chan2); West w = new West (Chan1); East e = new East (chan2);
c.start(); w.start(); e.start(); }
18

Vous aimerez peut-être aussi