Runnable vs callable vs future vs completablefuture

galera, to com uma dúvida e preciso de uma certa ajuda, estou atualizando um código que usa Threads e interface Runnable, que funciona muito bem, porém agora temos as interfaces Callable, Future e CompletableFuture, eu queria saber quando devo usar cada um desses casos, pois não vi necessidade de fazer esta troca, mas ao mesmo tempo não gostaria de deixar o código com aspecto defasado, alguém poderia me dar alguns exemplos ou indicar um bom material didático ?

Tambem ja tive esse duvida, segue resposta


observable-rxjava