Дано:Как использовать CompletableFuture.thenComposeAsync()?
public class Test
{
public static void main(String[] args)
{
int nThreads = 1;
Executor e = Executors.newFixedThreadPool(nThreads);
CompletableFuture.runAsync(() ->
{
System.out.println("Task 1. Thread: " + Thread.currentThread().getId());
}, e).thenComposeAsync((Void unused) ->
{
return CompletableFuture.runAsync(() ->
{
System.out.println("Task 2. Thread: " + Thread.currentThread().getId());
}, e);
}, e).join();
System.out.println("finished");
}
}
Я ожидаю одного ИСПОЛНИТЕЛЬ нить для выполнения задачи 1, затем задачи 2. Вместо этого, код висит, если nThreads
меньше 2.
- Пожалуйста, объясните, почему код висит. Я вижу, что он заблокирован в CompletableFuture:616, ожидая завершения
Future
, но непонятно, почему. - Если я разрешаю использовать 2 потока, для чего используется каждая нить?
Короче говоря, пожалуйста, помогите мне понять, как работает thenComposeAsync()
. Javadoc выглядит как она была написана для роботов, а не людей :)
Как правило, не используйте блокирующие операции в задачах (здесь join()) в задачах, выполняемых в пулах потоков, особенно в пулах фиксированных потоков. Разрешить блокировку только для независимых потоков. –
@AlexeiKaigorodov, это хороший момент, но в приведенном выше примере 'join()' выполняется вне задачи, не так ли? – Gili
есть, мой ошибка. –