Runnable은 완료를, Callable은 타입이 있는 결과와 실패를 전달한다

둘 다 Executor에서 실행할 수 있지만 호출자에게 돌려줄 계약이 다릅니다.

Runnable

run() · 반환값 없음 · 실행 사건

Callable<T>

call() → T · checked exception 가능

Future<T>

완료·값·실패·취소 손잡이

핵심: 값이 필요하면 공유 필드를 만들지 말고 Callable과 Future의 결과 채널을 사용합니다.