AsynHelper Библиотека Java включает в себя набор полезных классов/методов для таких асинхронных вызовов (и ожидания).
Если желательно, чтобы запустить набор вызовов методов или кодовых блоков асинхронном Она включает в себя полезный вспомогательный метод AsyncTask .submitTasks, как в ниже фрагменте.
AsyncTask.submitTasks(
() -> getMethodParam1(arg1, arg2),
() -> getMethodParam2(arg2, arg3)
() -> getMethodParam3(arg3, arg4),
() -> {
//Some other code to run asynchronously
}
);
Если необходимо подождать, пока все асинхронные коды завершения работает, AsyncTask.submitTasksAndWait varient может быть использован.
Кроме того, если это желательно, чтобы получить возвращаемое значение из каждых асинхронного вызова метода или кодового блока, то AsyncSupplier .submitSuppliers может быть использован таким образом, что результат может быть затем получен из массива поставщиков результата, возвращаемого метод. Ниже приведен пример фрагмента:
Supplier<Object>[] resultSuppliers =
AsyncSupplier.submitSuppliers(
() -> getMethodParam1(arg1, arg2),
() -> getMethodParam2(arg3, arg4),
() -> getMethodParam3(arg5, arg6)
);
Object a = resultSuppliers[0].get();
Object b = resultSuppliers[1].get();
Object c = resultSuppliers[2].get();
myBigMethod(a,b,c);
Если тип возврата каждого метода отличается, используйте приведенный ниже фрагмент.
Supplier<String> aResultSupplier = AsyncSupplier.submitSupplier(() -> getMethodParam1(arg1, arg2));
Supplier<Integer> bResultSupplier = AsyncSupplier.submitSupplier(() -> getMethodParam2(arg3, arg4));
Supplier<Object> cResultSupplier = AsyncSupplier.submitSupplier(() -> getMethodParam3(arg5, arg6));
myBigMethod(aResultSupplier.get(), bResultSupplier.get(), cResultSupplier.get());
В результате асинхронных вызовов методов/кодовые блоки могут быть также получены в другой точке кода в одной и той же нити или другого потока, как в приведенном ниже фрагменте.
AsyncSupplier.submitSupplierForSingleAccess(() -> getMethodParam1(arg1, arg2), "a");
AsyncSupplier.submitSupplierForSingleAccess(() -> getMethodParam2(arg3, arg4), "b");
AsyncSupplier.submitSupplierForSingleAccess(() -> getMethodParam3(arg5, arg6), "c");
//Following can be in the same thread or a different thread
Optional<String> aResult = AsyncSupplier.waitAndGetFromSupplier(String.class, "a");
Optional<Integer> bResult = AsyncSupplier.waitAndGetFromSupplier(Integer.class, "b");
Optional<Object> cResult = AsyncSupplier.waitAndGetFromSupplier(Object.class, "c");
myBigMethod(aResult.get(),bResult.get(),cResult.get());
Я хотел бы быть «нормальным» C# разработчик ...;) – SpaceBison
Почему это было бы неплохо: [колбеки наших поколений Перейти к себе] (http://tirania.org/blog/archive /2013/Aug-15.html) Мигелем де Иказой. – andrewdotn
Текущее решение Java не должно касаться фактических значений с префиксом 'async', но вместо этого используйте значения' Future' или 'Observable'. –