2

Представьте себе, что мы имеем следующую фиктивный код:Как CompletableFuture знает, что задачи независимы?

CompletableFuture<BigInteger> cf1 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(2L)); 
CompletableFuture<BigInteger> cf2 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(3L)); 
cf1.thenCombine(cf2, (x, y) -> x.add(y)).thenAccept(System.out::println); 

ли JVM знает, что cf1 и cf2 несут независимые потоки в этом случае? И что изменится, если потоки будут зависеть (например, использовать одно соединение с базой данных)?

Подробнее общая, как CompletableFuture синхронизировать темы?

ответ

1

A CompletableFuture не имеет отношения ни к какой теме. Это просто держатель для результата, полученного асинхронно с методами для работы с этим результатом.

staticsupplyAsync и runAsync методы - это только вспомогательные методы. Javadoc из supplyAsync заявляет

Возвращает новый CompletableFuture, который асинхронно завершено к задачи, работающей в ForkJoinPool.commonPool() со значением, полученным путем вызова данного Supplier.

Это более или менее эквивалентно

Supplier<R> sup = ...; 
CompletableFuture<R> future = new CompletableFuture<R>(); 
ForkJoinPool.commonPool().submit(() -> { 
    try { 
     R result = sup.get(); 
     future.complete(result); 
    } catch (Throwable e) { 
     future.completeExceptionally(e); 
    } 
}); 
return future; 

CompletableFuture возвращается, даже позволяет завершить его до задачи, представленной в бассейн.

Подробнее общая, как CompletableFuture синхронизировать темы?

Это не так, поскольку он не знает, какие потоки работают на нем. Это дополнительно намекают в javadoc

Так как (в отличие от FutureTask) этот класс не имеет прямого контроля над вычислений, что приводит к его быть завершена, отмена трактуется как только другая форма исключительного завершения. Метод cancel имеет тот же эффект, что и completeExceptionally(new CancellationException()). Способ isCompletedExceptionally() может использоваться для определения, если CompletableFuture выполнен в любой исключительной моды.

CompletableFuture объекты не контролируют обработку.

+0

Большое вам спасибо! – Everv0id

1

Я не думаю, что CompletableFuture (CF) «синхронизирует потоки». Он использует исполнителя you have provided или common pool, если вы его не предоставили.

Когда вы вызываете supplyAsync, CF отправляет различные задачи в этот пул, который поочередно управляет нижними потоками для выполнения задач.

+0

Благодарим вас за ответ.Я понимаю все, что вы сказали, я только хочу понять низкоуровневый фон для всего этого. – Everv0id

0

Он не знает и не пытается синхронизировать что-либо. Клиент по-прежнему несет ответственность за правильную синхронизацию доступа к изменяемым общим данным.