Eu adicionarei um pouco aqui porque eu tenho trabalhado com uma infinidade de Futures em Java ultimamente, mas tenho um background no desenvolvimento do Scala / Akka também. Esta resposta irá duplicar o que já foi dito, mas irá apontar a pletora de implementações em uso popular hoje na JVM.
Primeiro, o cartaz original menciona o uso de bloqueio e bloqueio - por favor, nunca faça isso fora dos testes.
Quando eu ensino conceitos de FP e Simultaneidade no meu papel atual, primeiro digo ao aluno que semanticamente promessas e futuros são sinônimos, porque como consumidor de uma promessa ou de uma futura API, o desenvolvedor não precisa entender que existem ou SE houver diferenças semânticas - apenas a mecânica para lidar com elas sem bloquear IO.
Dizer que um futuro não pode ser concluído e que uma promessa pode (por exemplo, como scala / akka / play apis, por exemplo) é muito simplista:
Alguns futuros podem ser concluídos
Java8 agora introduz um CompletableFuture na biblioteca padrão.
Algumas promessas não podem ser concluídas
Da mesma forma, na API de promessa do Google Play, uma Promessa não pode ser cumprida, mas uma RedeemablePromise pode ser reproduzida, introduzindo uma semântica diferente - mesmo estando sob o guarda-chuva Typesafe. Além disso, a API de promessa de reprodução pode converter com futuros scala em ambas as direções - (F.Promise.wrap (future) ou promise.wrapped ()).
Trabalhando com a tecnologia Typesafe no Java8, muitas vezes você vai e volta entre futuros / promessas simplesmente porque uma API é preferível (a API do Play Promise parece melhor com o Java8 lambdas). Em Akka + Play + Java8, você estará pegando futuros de Atores e envolvendo-os em promessas, compondo callbacks e retornando isso do controlador.
Então, como eu digo às pessoas quando ensino, Promessas e Futuros são mais ou menos sinônimos.