Асинхронность API G не делает это быстрым.Это позволяет только запустить его параллельно с шагами e и f.Если эти шаги не занимают много времени, то общее время не будет значительно уменьшено.
Итак, первый вопрос, на который вам нужно ответить, - может ли распараллеливание вообще помочь.Если ваша задача в основном последовательная, то распараллеливание не поможет, а может даже замедлить работу.Если ваша задача может быть распараллелена, вы представляете ее как граф выполнения.
Когда вы решите, что распараллеливание имеет смысл, вы можете выбрать для каждой параллельной ветви, будет ли она реализована в виде потока или асинхронноговызов процедуры (APC).Потоки легче программировать, но они занимают некоторое количество памяти (0,5-1,0 мегабайта на поток).Обычно стоит применять асинхронное программирование, если в вашем графике выполнения есть сотни и тысячи параллельных ветвей.Я не вижу такого большого параллелизма в вашей задаче, поэтому я рекомендую использовать потоки вместо асинхронных процедур.
И никогда не использовать опрос - и многопоточность, и асинхронное программирование имеют достаточно средств для реагирования на события во времени.
Что касается второго вопроса, в любом случае требуется некоторая ручная работа.Предположим, у вас есть API:
interface SyncApi {
boolean isPositive(int v1);
int sum(int v1, int v2);
}
, тогда вы должны написать
interface AsyncApi {
Future<Boolean> isPositive(int v1);
Future <Integer> sum(int v1, int v2);
}
. Вы можете создать инструмент, который создает AsyncApi.java, когда ему надоело SyncApi.java, но в любом случае вам нужноИнтерфейс AsyncApi во время компиляции, чтобы иметь возможность написать вызов для этого интерфейса.
Адаптер для создания экземпляра AsyncApi при наличии экземпляра SyncApi может быть создан во время выполнения с использованием Java Proxy механизм.