A biblioteca Java AsynHelper inclui um conjunto de classes / métodos utilitários para chamadas assíncronas (e espera).
Se desejar executar um conjunto de chamadas de método ou blocos de código de forma assíncrona, ele inclui um método auxiliar útil AsyncTask .submitTasks, como no snippet abaixo.
AsyncTask.submitTasks(
() -> getMethodParam1(arg1, arg2),
() -> getMethodParam2(arg2, arg3)
() -> getMethodParam3(arg3, arg4),
() -> {
//Some other code to run asynchronously
}
);
Se desejar aguardar até que todos os códigos assíncronos sejam executados, o variante AsyncTask.submitTasksAndWait pode ser usado.
Além disso, se desejar obter um valor de retorno de cada chamada de método assíncrona ou bloco de código, o AsyncSupplier .submitSuppliers pode ser usado para que o resultado possa ser obtido pela matriz de fornecedores de resultados retornada pelo método. Abaixo está o snippet de amostra:
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);
Se o tipo de retorno de cada método for diferente, use o tipo de trecho abaixo.
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());
O resultado do método assíncrono de chamadas / blocos de código também pode ser obtido em um ponto de código diferente no mesmo thread ou em um thread diferente do snippet abaixo.
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());