#java #asynchronous
#java #асинхронный
Вопрос:
Я хотел бы найти в стандартных библиотеках Java пример метода, который принимает обратный вызов в качестве аргумента, немедленно возвращает и вызывает обратный вызов, когда он выполнил свою задачу. Например, вы могли бы представить себе метод для получения пользовательского ввода с клавиатуры, который немедленно возвращается, но вызывает обратный вызов после ввода ввода.
Следующим лучшим будет метод, который вызывает прослушиватель, когда он выполнил свою задачу. Примером из Android SDK будет SoundPool.load()
and SoundPool.setOnLoadCompleteListener()
.
Я не рассматриваю методы Swing как addActionListener()
примеры, поскольку целью метода является добавление слушателя. Событие запуска полностью отдельное.
Моей мотивацией является подготовка лекции по Java I / O и желание противопоставить методы, которые (1) блокируют, (2) немедленно возвращаются с данными или без них или (3) используют обратные вызовы.
Комментарии:
1. Взгляните на реализации асинхронного канала Java NIO.
2. Спасибо, @Slaw. Я нашел AsynchronousFileChannel.write , на что я и надеялся. Вы хотите опубликовать ответ?
Ответ №1:
Одна группа примеров, которые вы ищете, — это реализации Java NIO AynchronousChannel. Например:
- AsynchronousFileChannel#блокировка(A, обработчик завершения)
- AsynchronousFileChannel#read(ByteBuffer, long, A, completionHandler)
- AsynchronousFileChannel#write(ByteBuffer, long, A, completionHandler)
- AsynchronousSocketChannel#connect(адрес сокета, A, обработчик завершения)
- Асинхронный сервер SocketChannel#accept(A, обработчик завершения)
Как вы можете видеть, все эти методы (и другие, не перечисленные) используют предоставленный обработчик завершения для уведомления вызывающих абонентов о завершении, независимо от того, была ли операция успешной или неудачной. Большинство, если не все, из этих методов имеют перегрузку, которая не принимает a CompletionHandler
, а вместо этого возвращает a Future
.
Есть также java.util.concurrent .CompletionStage, который имеет много методов, которые вызывают некоторую реализацию функционального интерфейса после завершения этапа.
Ответ №2:
Стандартная библиотека Java обычно использует Future
абстракцию вместо обратного вызова в качестве основного строительного блока. Если вы хотите создать структуру, основанную на «обратном вызове», вы затем используете then*
методы CompletionStage
(обычно CompletableFuture
).
Эта структура обеспечивает гибкость в том, как вызывающий объект хочет обрабатывать асинхронные результаты; например, я использовал ее для сбора разброса при нескольких последующих вызовах API, используемых для построения составного результата.
Комментарии:
1. Спасибо! Можете ли вы привести пример?
2. @EllenSpertus Методы «then» являются примером. Вы говорите
asyncResult.thenAccept(callback)
(или что угодноthen
, поскольку вы можете связать их произвольно).