La biblioteca Java AsynHelper incluye un conjunto de clases / métodos de utilidad para tales llamadas asincrónicas (y esperar).
Si se desea ejecutar un conjunto de llamadas a métodos o bloques de código de forma asincrónica, incluye un método auxiliar útil AsyncTask .submitTasks como en el siguiente fragmento.
AsyncTask.submitTasks(
() -> getMethodParam1(arg1, arg2),
() -> getMethodParam2(arg2, arg3)
() -> getMethodParam3(arg3, arg4),
() -> {
//Some other code to run asynchronously
}
);
Si se desea esperar hasta que todos los códigos asíncronos se completen, AsyncTask.submitTasksAndWait se puede usar AsyncTask.submitTasksAndWait.
Además, si se desea obtener un valor de retorno de cada una de las llamadas al método asincrónico o bloque de código, se puede usar AsyncSupplier .submitSuppliers para que el resultado se pueda obtener de la matriz de proveedores de resultados devuelta por el método. A continuación se muestra el fragmento de muestra:
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);
Si el tipo de retorno de cada método difiere, use el siguiente fragmento de fragmento.
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());
El resultado de las llamadas al método asincrónico / bloques de código también se puede obtener en un punto de código diferente en el mismo hilo o en un hilo diferente que en el fragmento de código siguiente.
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());