Средства обмена данными java
Класс 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) < Exchangerex = new Exchanger(); new Thread(new PutThread(ex)).start(); new Thread(new GetThread(ex)).start(); > > class PutThread implements Runnable < Exchangerexchanger; String message; PutThread(Exchanger 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 < Exchangerexchanger; String message; GetThread(Exchanger 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 возвращает данные, которые отправил в буфер другой поток. То есть происходит обмен данными. Хотя нам необязательно получать данные, мы можем просто их отправить:
Логика класса GetThread аналогична — также отправляется сообщение.
В итоге консоль выведет следующий результат:
PutThread has received: Hello World! GetThread has received: Hello Java!
Средства обмена данными java
A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches with a partner thread, and receives its partner’s object on return. An Exchanger may be viewed as a bidirectional form of a SynchronousQueue . Exchangers may be useful in applications such as genetic algorithms and pipeline designs. Sample Usage: Here are the highlights of a class that uses an Exchanger to swap buffers between threads so that the thread filling the buffer gets a freshly emptied one when it needs it, handing off the filled one to the thread emptying the buffer.
class FillAndEmpty < Exchangerexchanger = new Exchanger(); DataBuffer initialEmptyBuffer = . a made-up type DataBuffer initialFullBuffer = . class FillingLoop implements Runnable < public void run() < DataBuffer currentBuffer = initialEmptyBuffer; try < while (currentBuffer != null) < addToBuffer(currentBuffer); if (currentBuffer.isFull()) currentBuffer = exchanger.exchange(currentBuffer); >> catch (InterruptedException ex) < . handle . >> > class EmptyingLoop implements Runnable < public void run() < DataBuffer currentBuffer = initialFullBuffer; try < while (currentBuffer != null) < takeFromBuffer(currentBuffer); if (currentBuffer.isEmpty()) currentBuffer = exchanger.exchange(currentBuffer); >> catch (InterruptedException ex) < . handle . >> > void start() < new Thread(new FillingLoop()).start(); new Thread(new EmptyingLoop()).start(); >>
Memory consistency effects: For each pair of threads that successfully exchange objects via an Exchanger , actions prior to the exchange() in each thread happen-before those subsequent to a return from the corresponding exchange() in the other thread.
Constructor Summary
Method Summary
Waits for another thread to arrive at this exchange point (unless the current thread is interrupted), and then transfers the given object to it, receiving its object in return.
Waits for another thread to arrive at this exchange point (unless the current thread is interrupted or the specified waiting time elapses), and then transfers the given object to it, receiving its object in return.
Средства обмена данными java
A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches with a partner thread, and receives its partner’s object on return. An Exchanger may be viewed as a bidirectional form of a SynchronousQueue . Exchangers may be useful in applications such as genetic algorithms and pipeline designs. Sample Usage: Here are the highlights of a class that uses an Exchanger to swap buffers between threads so that the thread filling the buffer gets a freshly emptied one when it needs it, handing off the filled one to the thread emptying the buffer.
class FillAndEmpty < Exchangerexchanger = new Exchanger<>(); DataBuffer initialEmptyBuffer = . a made-up type DataBuffer initialFullBuffer = . class FillingLoop implements Runnable < public void run() < DataBuffer currentBuffer = initialEmptyBuffer; try < while (currentBuffer != null) < addToBuffer(currentBuffer); if (currentBuffer.isFull()) currentBuffer = exchanger.exchange(currentBuffer); >> catch (InterruptedException ex) < . handle . >> > class EmptyingLoop implements Runnable < public void run() < DataBuffer currentBuffer = initialFullBuffer; try < while (currentBuffer != null) < takeFromBuffer(currentBuffer); if (currentBuffer.isEmpty()) currentBuffer = exchanger.exchange(currentBuffer); >> catch (InterruptedException ex) < . handle . >> > void start() < new Thread(new FillingLoop()).start(); new Thread(new EmptyingLoop()).start(); >>
Memory consistency effects: For each pair of threads that successfully exchange objects via an Exchanger , actions prior to the exchange() in each thread happen-before those subsequent to a return from the corresponding exchange() in the other thread.
Constructor Summary
Method Summary
Waits for another thread to arrive at this exchange point (unless the current thread is interrupted), and then transfers the given object to it, receiving its object in return.
Waits for another thread to arrive at this exchange point (unless the current thread is interrupted or the specified waiting time elapses), and then transfers the given object to it, receiving its object in return.