Класс Exchanger предназначен для обмена данными между потоками. Он является типизированным и типизируется типом данных, которыми потоки должны обмениваться.
Обмен данными производится с помощью единственного метода этого класса exchange():
V exchange(V x) throws InterruptedException V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
Параметр x представляет буфер данных для обмена. Вторая форма метода также определяет параметр timeout - время ожидания и unit - тип временных единиц, применяемых для параметра timeout.
Данный класс очень просто использовать:
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());
}
}
}
В классе PutThread отправляет в буфер сообщение "Hello Java!":
message=exchanger.exchange(message);
Причем в ответ метод exchange возвращает данные, которые отправил в буфер другой поток. То есть происходит обмен данными. Хотя нам необязательно получать данные, мы можем просто их отправить:
exchanger.exchange(message);
Логика класса GetThread аналогична - также отправляется сообщение.
В итоге консоль выведет следующий результат:
PutThread has received: Hello World! GetThread has received: Hello Java!