Я только начал изучать некоторые функции concurrency Java 8. Одна вещь немного смутила меня этими двумя статическими методами:
CompletableFuture<Void> runAsync(Runnable runnable)
CompletableFuture<U> supplyAsync(Supplier<U> supplier)
Кто-нибудь знает, почему они решили использовать интерфейс поставщика? Не более ли естественно использовать Callable, что является аналогией Runnable, которая возвращает значение? Это потому, что поставщик не выбрасывает исключение, которое невозможно обработать?