MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Schimbul de date între thread-uri - Clasa Exchanger

Clasa Exchanger este concepută pentru schimbul de date între thread-uri. Aceasta este o clasă generică, parametrizată cu tipul de date care trebuie schimbate între thread-uri.

Schimbul de date se realizează cu ajutorul singurei metode a acestei clase, exchange():

V exchange(V x) throws InterruptedException
V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

Parametrul x reprezintă bufferul de date pentru schimb. A doua formă a metodei definește, de asemenea, parametrii timeout – timpul de așteptare, și unit – tipul unităților de timp aplicate parametrului timeout.

Această clasă este foarte ușor de utilizat. Să vedem un exemplu practic:

import java.util.concurrent.Exchanger;

public class Program {

   public static void main(String[] args) {
       
       Exchanger<String> ex = new Exchanger<String>();
       new Thread(new PutThread(ex)).start();
       new Thread(new GetThread(ex)).start();
   }
}

class PutThread implements Runnable {

   Exchanger<String> exchanger;
   String message;

   PutThread(Exchanger<String> ex) {
       this.exchanger = ex;
       message = "Hello Java!";
   }

   public void run() {
       try {
           message = exchanger.exchange(message);
           System.out.println("PutThread has received: " + message);
       } catch (InterruptedException ex) {
           System.out.println(ex.getMessage());
       }
   }
}

class GetThread implements Runnable {

   Exchanger<String> exchanger;
   String message;

   GetThread(Exchanger<String> ex) {
       this.exchanger = ex;
       message = "Hello World!";
   }

   public void run() {
       try {
           message = exchanger.exchange(message);
           System.out.println("GetThread has received: " + message);
       } catch (InterruptedException ex) {
           System.out.println(ex.getMessage());
       }
   }
}

În clasa PutThread, se trimite în buffer mesajul "Hello Java!":

message = exchanger.exchange(message);

În acest moment, metoda exchange returnează datele care au fost trimise în buffer de către celălalt thread, realizându-se astfel schimbul de date. Deși nu este obligatoriu să primim date, putem doar să le trimitem:

exchanger.exchange(message);

Logica din clasa GetThread este similară – și ea trimite un mesaj.

Rezultatul afișat în consolă va fi:

PutThread has received: Hello World!
GetThread has received: Hello Java!

Astfel, cele două thread-uri au schimbat mesaje între ele prin intermediul clasei Exchanger.

← Lecția anterioară Lecția următoare →