Как я могу "преобразовать" вызов метода блокировки в CompletableFuture ?Пример:
T waitForResult() throws InterruptedException {
obj.await(); // blocking call
// ...
return something;
}
Мне нужно превратить это в следующее:
CompletableFuture.of(this::waitForResult); // .of(Callable<T>) doesn't exist
Некоторые моменты, которые следует учитывать:
waitForResult()
может вызывать исключения.Они должны обрабатываться правильно, чтобы completableFuture.get()
выдавало InterruptedException
или ExecutionException
. - Не должно быть другого вовлеченного потока (
supplyAsync()
сделает это). - Это должно быть CompletableFuture (возможно, в оболочке).
Я пробовал это, но это не будет правильно обрабатывать исключения:
CompletableFuture.completedFuture(Void.TYPE).thenApply(v -> {
try {
listener.await();
// ...
return listener.getResult();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (SnmpException e) {
throw new RuntimeException(e);
}
});
Я знаю Создать CompletableFutureиз вызова метода синхронизации , но это мне не помогает:
- Исходный код в вопросе блокирует основной поток
- Код в ответах также включает в себятретий поток или неправильно обрабатывает исключения (поправьте меня, если я ошибаюсь)