Поиск примера асинхронных методов в стандартной библиотеке Java

#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. Например:

Как вы можете видеть, все эти методы (и другие, не перечисленные) используют предоставленный обработчик завершения для уведомления вызывающих абонентов о завершении, независимо от того, была ли операция успешной или неудачной. Большинство, если не все, из этих методов имеют перегрузку, которая не принимает a CompletionHandler , а вместо этого возвращает a Future .

Есть также java.util.concurrent .CompletionStage, который имеет много методов, которые вызывают некоторую реализацию функционального интерфейса после завершения этапа.

Ответ №2:

Стандартная библиотека Java обычно использует Future абстракцию вместо обратного вызова в качестве основного строительного блока. Если вы хотите создать структуру, основанную на «обратном вызове», вы затем используете then* методы CompletionStage (обычно CompletableFuture ).

Эта структура обеспечивает гибкость в том, как вызывающий объект хочет обрабатывать асинхронные результаты; например, я использовал ее для сбора разброса при нескольких последующих вызовах API, используемых для построения составного результата.

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

1. Спасибо! Можете ли вы привести пример?

2. @EllenSpertus Методы «then» являются примером. Вы говорите asyncResult.thenAccept(callback) (или что угодно then , поскольку вы можете связать их произвольно).