#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() { BlockingQueueq = 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(); } }
Комментариев нет:
Отправить комментарий