Класс Exchanger, примеры реализации кода в Java

Класс Exchanger, примеры реализации кода в JavaВероятно, наиболее интересным с точки зрения синхронизации является класс Exchanger, предназначенный для упрощения процесса обмена данными между двумя потоками исполнения.

Принцип действия класса Exchanger очень прост: он ожидает до тех пор, пока два отдельных потока исполнения не вызовут его метод exchange(). Как только это произойдет, он произведет обмен данны­ми, предоставляемыми обоими потоками. Такой механизм обмена данными не только изящен, но и прост в применении.

Нетрудно представить, как воспользо­ваться классом Exchanger. Например, один поток исполнения подготавливает буфер для приема данных через сетевое соединение, а другой — заполняет этот бу­фер данными, поступающими через сетевое соединение. Оба потока исполнения действуют совместно, поэтому всякий раз, когда требуется новая буферизация, осуществляется обмен данными.

Класс Exchanger является обобщенным и объявляется приведенным ниже об­разом, где параметр V определяет тип обмениваемых данных.

В классе Exchanger определяется единственный метод exchange(), имеющий следующие общие формы:

где параметр буфер обозначает ссылку на обмениваемые данные. Возвращаются данные, полученные из другого потока исполнения.

Вторая форма метода exchange() позволяет определить время ожидания. Главная особенность мето­да exchange() состоит в том, что он не завершится успешно до тех пор, пока не будет вызван для одного и того же объекта типа Exchanger из двух отдель­ных потоков исполнения. Подобным образом метод exchange() синхронизи­рует обмен данными.

Дорогие читатели, в планах менять дизайн блога. Думаю натянуть HTML шаблон ThemeForest Findeo на WordPress, или найти подобный. Если есть какие-нибудь идеи обязательно оставьте их в комментарии.

В приведенном ниже примере программы демонстрируется применения клас­са Exchanger. В этой программе создаются два потока исполнения.

В одном пото­ке исполнения создается пустой буфер, принимающий данные из другого потока исполнения. Таким образом, первый поток исполнения обменивает пустую сим­вольную строку на полную.

Ниже показаны результаты выполнения данной программы.

В методе main() данной программы сначала создается объект класса Exchanger. Этот объект служит для синхронизации обмена символьными строка­ми между классами MakeString и UseString. Класс MakeString заполняет символьную строку данными, а класс UseString обменивает пустую символьную стро­ку на полную, отображая затем ее содержимое.

Обмен пустой символьной строки на полную в буфере синхронизируется методом exchange(), который вызывается из метода run() в классах MakeString и UseString.

Советуем вам следующее видео к просмотру: