Я пишу библиотеку, которая предлагает несколько асинхронных методов, которые возвращают CompletableFutures.Библиотека имеет внутренний пул потоков для выполнения вычислительной работы асинхронных методов.
Я хочу убедиться, что выполнены следующие два требования:
- возвращаемое CompletableFuture НЕ завершеновнутренним потоком, так что цепочки CompletableFuture, внешние по отношению к моей библиотеке, никогда не выполняются внутренним пулом потоков библиотеки
- все вычисления моего асинхронного метода выполняются внутренним пулом потоков, а НЕ пользовательским потоком (то есть потоком).вызывающего метода)
Допустим, библиотека имеет следующий метод блокировки
Data request(Address address) {
Message request = encode(address);
Message response = sendAndReceive(request);
Data responseData = decode(response);
return responseData;
}
и соответствующий асинхронный метод
CompletableFuture<Data> requestAsync(Address address) {
return CompletableFuture.supplyAsync(() -> encode(address), internalThreadPool)
.thenCompose(request -> sendAndReceiveAsync(request))
.thenApply(response -> decode(response));
}
Первое требованиевстречается путем добавления цепочки .whenCompleteAsync((v,t) -> {})
, как объяснено в этого ответа .
Но что нужно сделать, чтобы выполнить второе требование?