Будущее Java 8 CompletableFuture без необходимости ждет другого будущего - PullRequest
0 голосов
/ 16 октября 2018

У меня есть этот простой код ниже.Все фьючерсы должны начинаться одновременно.future13 должен работать сразу после фьючерсов 1 и 3, но в журналах я вижу, что он ждет, пока фьючерсы 1, 2, 3 и 4 не закончатся.Почему он ждет фьючерсов 2 и 4?

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

import org.junit.Test;


public class Test1 {

    private void loop(Long id, int max) {
        try {
            for (int i = 0; i < max; i++) {
                System.out.println(id);
                Thread.sleep(100);
            }
        } catch (Throwable t) {
            System.out.println(t);
        }
    }

    private CompletableFuture<Void> createConfigFuture(Long id) {
        return CompletableFuture.supplyAsync(() -> {
            loop(id, 100);
            return null;
        });
    }

    @Test
    public void testMe() {
        CompletableFuture<Void> future1 = createConfigFuture(1L);
        CompletableFuture<Void> future2 = createConfigFuture(2L);
        CompletableFuture<Void> future3 = createConfigFuture(3L);
        CompletableFuture<Void> future4 = createConfigFuture(4L);

        try {
            CompletableFuture<Void> future13 = CompletableFuture.allOf(future1, future3)
                .thenApply(v -> {
                    loop(999L, 5);
                    return null;
                });
            CompletableFuture<Void> mainFuture = CompletableFuture.allOf(future13, future2, future4);
            mainFuture.get();

        } catch (InterruptedException | ExecutionException e) {
            System.out.println(e);
        }
    }
}

1 Ответ

0 голосов
/ 16 октября 2018

Существует очередь для получения слота выполнения в стандартном JRE-соединении JRE Executor, в которое будут сериализованы все асинхронные задачи.

Задача #2 опережает задачу #3 вчто Executor очередь, поэтому, прежде чем наблюдать за выполнением задачи #3 (и, соответственно, задачи завершения #13), #2 должен сначала получить свой слот выполнения.

Это можетбыть замеченным как #3 связанный с #2, но кроме этого не должно быть никакой дополнительной связи между задачами.

...