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.