Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Что такое callback-интерфейсы и с чем их едят?

#java


Изучая интерфейсы, наткнулся на такую штуку,как callbak-интерфейс. Если я правильно
понял,то это интерфейс-маячок,который можно прикрутить к чему-нибудь,что будет дергать
этот интерфейс в случае каких-либо изменений(например такой интерфейс можно весить
на канал связи и в случае прихода сообщений выполнять какое-то действие) и он в свою
очередь будет выполнять прописанные методы. Вопрос в том как его реализовывать.Примеры
из туториалов,которые  я нашел в сети мне не совсем понятны. Объясните пожалуйста,
как реализуется эта штука, или поделитесь ссылками на хорошие материалы по данной теме.
    


Ответы

Ответ 1



callback - обратный вызов - понятие и применение очень широкое. callback-и вроде вашего маячка называют listener-ами(слушателями по-нашему). Они регистрируются функцией регистрации и потом вызываются не понятно кем и не известно когда (наступит событие или нет? когда? кто знает...) Есть и другие виды callback-ов. Например в Win32 APIесть функция EnumWindows для перечисления открытых окошек. Она принимает в качестве параметра функцию обратного вызова EnumWindowsProc. EnumWindows знает что вам нужны эти окошки, но не знает зачем. Кроме того по каким-то важным причинам она не хочет выдавать Вам сразу готовый список. Но с помощью callback она сдаст всех по-одному. Для каждого обнаруженного окошка вызывается Ваша функция EnumWindowsProc, чтобы в ней Вы сами разобрались с этим окошком. И здесь функция callback если будет вызвана, то только во время работы EnumWindows, а не когда-нибудь потом.

Ответ 2



Оффтопик для демонстрации идеи с очередью. Вот немного переделанный пример про BlockingQueue из Javadoc: Один thread в бесконечном цикле вставляет в очередь, другой извлекает. Читатель чисел практически не блокируется (только на время вызова queue.take()). Observer или любой другой callback заставит его ждать пока не завершится этот самый callback, прежде чем приступить к чтению следующего числа. class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Number produce() { // читает из точки очередное число // или столько сколько нужно для вычисления среднего и возвращает его Number x = ...; return x; } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Number x) { // рассылает число по сокетам } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }

Комментариев нет:

Отправить комментарий