Thread 클래스와 Runnable 함수형 인터페이스를 구현해 Thread를 생성한다.Callable, Future, Executors 등이 등장하게 되었다. Runnable 인터페이스는 결과를 반환할 수 없다는 한계점이 있었다. Callable이 추가되었다.Callable 인터페이스의 구현체인 Task는 가용 가능한 쓰레드가 없어서 실행이 미뤄질 수 있고, 작업 시간이 오래 걸릴 수도 있다.@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
Callable의 반환값을 구하기 위해 사용된다.Future 는 비동기 작업을 갖고 있어 미래에 실행 결과를 얻도록 도와준다.Executor 인터페이스는 쓰레드 풀의 구현을 위한 인터페이스이다. public interface Executor {
void execute(Runnable command);
}
작업(Runnable, Callable) 등록을 위한 인터페이스
ExecutorService는 Executor 를 상속받아서 작업 등록 뿐만 아니라 실행을 위한 책임도 갖는다.
쓰레드 풀은 기본적으로 ExecutorService 인터페이스를 구현한다.

ExecutorService는 Runnable과 Callbale을 작업으로 사용하기 위한 메소드를 제공한다. 동시에 여러 작업들을 실행시키는 메소드도 제공하고 있는데, 비동기 작업의 진행을 추적할 수 있도록 Future를 반환한다.
submit() Future들을 반환한다.Future들은 모두 실행된 것이므로 반환된 isDone은 true이다.invokeAll()List<Future>를 반환한다.invokeAny()Executor, ExecutorService 또는 SchedueledExecutorService를 구현한 쓰레드 풀을 손쉽게 생성해준다.newFixedThreadPool(int nThreads) ExecutorService 인터페이스를 구현한 ThreadPoolExecutor 객체가 생성된다.
출처
[Java] Executors Thread 사용법
[JAVA8 병렬프로그래밍] Executors 클래스, ExecutorService 인터페이스
[Java] Callable, Future 및 Executors, Executor, ExecutorService, ScheduledExecutorService에 대한 이해 및 사용법
ExecutorService를 이용해 multi thread 활용하기 (Java)